"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > تنفيذ المصفوفات الديناميكية

تنفيذ المصفوفات الديناميكية

تم النشر بتاريخ 2024-07-31
تصفح:784

Implementing Dynamic Arrays

يفترض فهم تدوين Big O. الأمثلة موجودة في جافا سكريبت. مراجع المعلومات "Cracking the Coding Interview" بقلم جايل لاكمان ماكدويل

مقدمة

في بعض اللغات مثل JavaScript أو Python، يمكن تغيير حجم المصفوفات تلقائيًا، مما يعني أنها ستنمو عند إلحاق العناصر. في لغات أخرى مثل Java، تكون المصفوفات ذات أطوال ثابتة، مما يعني أن الحجم يتم تحديده عند تهيئة المصفوفة. تسمى هذه المصفوفات التي تنمو تلقائيًا المصفوفات الديناميكية.

فهم المصفوفات الديناميكية

في Java، ArrayList عبارة عن بنية بيانات تشبه المصفوفة توفر تغيير الحجم الديناميكي مع الاستمرار في توفير ( 1 ) O(1) O(1) وصول. عندما تكون المصفوفة ممتلئة، يتضاعف حجم المصفوفة. كل مضاعفة تأخذ ( ن ) O (ن) على) الوقت، ولكنه نادرًا ما يحدث لدرجة أن وقت إدخاله المطفأ لا يزال ثابتًا ( 1 ) O(1) O(1) . من بين لغات البرمجة المختلفة، يختلف اسم بنية البيانات هذه بالإضافة إلى عامل تغيير الحجم (وهو 2 في Java). يحدد عامل تغيير الحجم حجم المصفوفة التي سيتم تغيير حجمها. لماذا هو وقت الإدراج المطفأ

( 1 ) O(1) O(1) ؟ عند تغيير الحجم، بافتراض أن عامل تغيير الحجم هو 2، يمكننا أن نلاحظ أننا قمنا بزيادة حجم المصفوفة N عن طريق مضاعفة المصفوفة السابقة (والتي هي نصف N). علاوة على ذلك، نحتاج أيضًا إلى النسخ N

2 N/2 ]N/2 عناصر لهذه المجموعة الجديدة. إذا قمنا بجمع عدد العناصر التي ننسخها من زيادة السعة النهائية إلى زيادة السعة الأولى: 2

ن ]4 n8 n 16 . . 2 1 \frac{n}{2} \frac{n}{4} \frac{n}{8} \frac{n}{16 } ... 2 1 [2] &&&] 4 ]n 8 n 16 ن ... 2 1 والتي مجموعها أقل بقليل من N. لذلك، فإن إدخال عناصر N يستغرق حوالي ( ن ) O (ن) على) العمل في المجموع. كل إدراج هو ( 1 ) O(1) O(1) في المتوسط، على الرغم من أن بعض عمليات الإدراج تستغرق ( ن ) O (ن) على) الوقت في أسوأ الأحوال. المفاهيم الأساسية والتعقيد الكبير تحتوي المصفوفات الديناميكية في JavaScript عادةً على عدة طرق أساسية، لكل منها تعقيدات زمنية مختلفة: get(i): تسترد هذه الطريقة العنصر الموجود في الفهرس i. تعقيد: ( 1 ) O(1) O(1) set(i, n): تقوم هذه الطريقة بتعيين العنصر في الفهرس i إلى n. تعقيد: (

1

)

O(1)

  • O(1) pushback(n): تضيف هذه الطريقة العنصر n إلى نهاية المصفوفة. تعقيد: ( 1 ) O(1)

    O(1)
  • المطفأة، ولكن ( ن ) O (ن) على)
  • عند حدوث تغيير الحجم

popback(): تقوم هذه الطريقة بإزالة العنصر الأخير من المصفوفة.
  • تعقيد: ( 1 ) O(1) O(1) resize(): تعمل هذه الطريقة على مضاعفة سعة المصفوفة ونسخ جميع العناصر إلى المصفوفة الجديدة. تعقيد: ( ن ) O (ن) على)

  • getSize(): تقوم هذه الطريقة بإرجاع عدد العناصر في المصفوفة. تعقيد: ( 1 ) O(1) O(1)

ملاحظة
    : نحن قادرون على تحقيق هذا التعقيد باستخدام متغير الحجم لتتبع عدد الفتحات المملوءة في المصفوفة.
  • getCapacity(): تُرجع هذه الطريقة السعة الحالية للمصفوفة. تعقيد: ( 1 ) O(1) O(1)

  • التنفيذ في جافا سكريبت فئة DynamicArray { // الحجم هو # الفتحات المملوءة بينما السعة هي إجمالي الفتحات في المصفوفة منشئ (القدرة) { this.capacity = القدرة؛ this.arr = new Array(this.capacity); this.size = 0; } // يا(1) الحصول على (ط) { إذا (i = this.size) يُرجع غير محدد؛ إرجاع this.arr[i]; } // يا(1) اجلس هنا) { إذا (i = this.size) يُرجع غير محدد؛ this.arr[i] = n; } // O(1) مطفأة التراجع (ن) { إذا (this.size === this.capacity) { this.resize(); } this.arr[this.size] = n; هذا الحجم ؛ } // يا(1) عودة البوب() { إذا (this.size === 0) يُرجع غير محدد؛ هذا الحجم--؛ دع درجة الحرارة = this.arr[this.size]; this.arr[this.size] = غير محدد; درجة حرارة العودة؛ } // على) تغيير الحجم() { this.capacity *= 2; دع newArr = new Array(this.capacity); من أجل (دع i = 0؛ i خاتمة تعد المصفوفات الديناميكية بنية بيانات قوية تجمع بين مرونة التخزين القابل لتغيير الحجم وكفاءة الوصول في الوقت الثابت. أتمنى أن يساعدك هذا!
بيان الافراج تم نشر هذه المقالة على: https://dev.to/jihoonj/implementing-dynamic-arrays-5fb5?1 إذا كان هناك أي انتهاك، يرجى الاتصال بـ [email protected] لحذفه
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3