مصفوفة ديناميكية

مثال لوضعية المصفوفة الديناميكية في ذاكرة الوصول العشوائي
مثال لوضعية المصفوفة الديناميكية في ذاكرة الوصول العشوائي

المصفوفات الديناميكية أو المصفوفة الحيوية (بالإنجلزية: dynamic array) هي نوع خاص من البايانات في لغات البرمجة [1] ، تحتوي على عدد متغير من العناصر مرتبة بشكل أعمدة وحقول متعدد الأبعاد. كل العناصر لديها نفس النوع [2]، ويسمى «النوع الداخلي» للمجموعة، على عكس المصفوفة الثابتة التي يحدد حجمها ونوع العنصر في وقت البرمجة، المصفوفة الديناميكية يحدد نوع العنصر فقط، ويتم تغيير سعة الإستيعاب في وقت التنفيذ.

لا يقصد بالمصفوفة الديناميكية حجم أو قيمة العنصر ولا عدد العناصر بل بالاستعاب الأقصى لعدد العناصر.

في المصفوفة ديناميكية، الطول الأولي للمجموعة هو صفر. يجب تعيين طول الفعلي للمجموعة بستخدام وظيفة توفرها لغة البرمجة، والتي ستقوم بحجز الذاكرة اللازمة لتخزين عناصر المصفوفة. قد يتم الحجز في نفس المكان أو قد يتم نقل كل المصفوفة إلى منطقة جديدة في الذاكرة ونقل قيم العناصر فيها ويسمى «النسخ المتماثل» وهي عملية للحفاظ على قيمة ومكان كل عنصر من المجموعة داخل المصفوفة.

طريقة العمل

العملية يتحكم فيها عدة عوامل منها لغة البرمجة أو حجم العنصر في المصفوفة أو مكان التواجد في الذاكرة.

يتم تخصيص ذاكرة ديناميكية بواسطة طلب كومة من الذاكرة، ذاكرة الكمبيوتر محدود ويمكن أن تستنفد. فلا توجد ضمانات بأن جميع طلبات تخصيص الذاكرة تمنح من قبل النظام.

في الكثير من لغات البرمجة اسم المصفوفه هو مؤشر يشير إلى أول عنصر من عناصر المصفوفه[3] بمعنى أن الاسم هو مكان يحجز في الذاكرة يحتوى على عنوان أول عنصر فيها، ويمكن استخدام اسم المصفوفه كمؤشر تجرى عليه العمليات الخاصة بالمؤشرات.

اما بالنسبة لخطوات تحجيم المصفوفة تكون كالتالي:

  1. يتم تحديث الحقل حجم
  2. يتم حجز الذاكرة للمجموعة الجديدة مع الحجم الجديد.
  3. يتم ملئ المجموعة الجديدة بقيمة افتراضية (null – 0).
  4. يتم نسخ العناصر من مجموعة ثابتة القديمة إلى مجموعة جديدة
  5. يتم تغيير مؤشر مجموعة ثابت إلى مجموعة جديدة.
  6. يتم التخلص من ذاكرة المجموعة القديمة

من الناحية الفنية هناك حالات يمكن أن تغير من الخطوات:

  • إذا كان هناك مساحة في الذاكرة كافية بعد آخر عنصر في المجموعة، فقط الخطوة رقم 1 و 3 ستعمل ويتم الاستغاء عن باقي الخطوات.
  • إذا كانت العملية هي تقليص سعة المصفوفة، فقط الخطوة رقم 1 و 6 ستعمل.
  • إذا كان هناك من متغيرات (مؤشر) يشير إلى عنصر من المجموعة، لن يتم التخلص من مجموعة القديمة، لأن المتغيرات الأخرى سوف تستمر للإشارة إلى البيانات القديمة.

الأداء

مقارنة قائمة متصلة مصفوفة مصفوفة ديناميكية Balanced tree
فهرسة Θn Θ1 Θ1 Θ log n
إضافة إزالة عنصر في البداية Θ1 N/A Θn Θ log n
إضافة إزالة عنصر في النهاية Θ n N/A Θ1 Θ log n
تضييع المساحة Θn 0 Θn Θn

للحصول على أداء سريع في البرامج، فإنه من المهم فهم الآثار المترتبة على خطوة ملئ المجموعة الجديدة بقيمة افتراضية وعملية نسخ العناصر. كلما قمت بتغيير حجم المصفوفة الديناميكية [4]، سيتم نسخ مجموعة، وهو ما يعني بالتكرار الحجز والتحرير في الذاكرة، سيأخذ هذا وقت يتناسب مع حجم [5] المصفوفة، فكلما زاد حجم المصفوفة زاد الوقت المطلوب لتغيير الحجم.

المصفوفة الديناميكية تمتلك العديد من المزايا عن المصفوفة العادية، في استخدام ذاكرة التخزين المؤقت للبيانات، الاكتناز (استخدام ذاكرة منخفضة)، والوصول العشوائي.. هذا يجعل المصفوفات الحيوية أداة جذابة لبناء هياكل البيانات سهلة في ذاكرة التخزين المؤقت. ومع ذلك، في لغات مثل بايثون أو جافا[6] التي تفرض دلالات مرجعية، المصفوفة الديناميكية عموما لن تخزن البيانات فعليا، بل سيتم تخزين المؤشر إلى العنصر المتواجد في مناطق أخرى من الذاكرة. في هذه الحالة، سوف لن تترتب العناصر بشكل متجاور في الذاكرة، ويتم فقدان العديد من المزايا من تخص ذاكرة التخزين المؤقت.

مراجع

  1. ^ د.محمد علي احمد - جامعة السويس ماهي المصفوفة نسخة محفوظة 10 يناير 2017 على موقع واي باك مشين.
  2. ^ جامعة الأزهر - غزة - فلسطين ( حسن فرج حبوب-: محمد تيسير مرتجى)- مبادئ البرمجة نسخة محفوظة 05 مارس 2016 على موقع واي باك مشين.
  3. ^ المؤشرات في لغة السي و السي++ - kettaneh.net مجلة تعليمية نسخة محفوظة 13 أبريل 2017 على موقع واي باك مشين. [وصلة مكسورة]
  4. ^ "بنى المعطيات- " مدونة ماستر نسخة محفوظة 25 يوليو 2017 على موقع واي باك مشين.
  5. ^ تغيير حجم الأمثل في الزمان والمكان (التقرير الفني CS-99-09) نسخة محفوظة 30 مايو 2016 على موقع واي باك مشين.
  6. ^ وثائق الجافا - اوراكل نسخة محفوظة 03 نوفمبر 2017 على موقع واي باك مشين.