مصفوفة ديناميكية
[[ملف:Dynamicarray.png|alt=مثال لوضعية المصفوفة الديناميكية في ذاكرة الوصول العشوائي|تصغير|مثال لوضعية المصفوفة الديناميكية في [[ذاكرة الوصول العشوائي]]]]
'''المصفوفات الديناميكية''' أو المصفوفة الحيوية (بالإنجلزية: dynamic array) هي نوع خاص من البايانات في لغات البرمجة <ref>د.محمد علي احمد - جامعة السويس [http://faculty.uoh.edu.sa/ma.ahmed/files/records2.pdf ماهي المصفوفة] {{Webarchive|url=https://web.archive.org/web/20170110210938/http://faculty.uoh.edu.sa/ma.ahmed/files/records2.pdf |date=10 يناير 2017}}</ref> ، تحتوي على عدد متغير من العناصر مرتبة بشكل أعمدة وحقول متعدد الأبعاد. كل العناصر لديها نفس النوع <ref>[[جامعة الأزهر (غزة)|جامعة الأزهر - غزة - فلسطين]] ( حسن فرج حبوب-: محمد تيسير مرتجى)- [http://www.pchm.yoll.net/basic/array.html مبادئ البرمجة] {{Webarchive|url=https://web.archive.org/web/20160305065522/http://www.pchm.yoll.net/basic/array.html |date=05 مارس 2016}}</ref>، ويسمى «النوع الداخلي» للمجموعة، على عكس المصفوفة الثابتة التي يحدد حجمها ونوع العنصر في وقت البرمجة، المصفوفة الديناميكية يحدد نوع العنصر فقط، ويتم تغيير سعة الإستيعاب في [[وقت التنفيذ]].

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

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

== طريقة العمل ==

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

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

في الكثير من لغات البرمجة اسم المصفوفه هو مؤشر يشير إلى أول عنصر من عناصر المصفوفه<ref>[http://www.kettaneh.net/programming/c18.htm المؤشرات في لغة السي و السي++] - kettaneh.net مجلة تعليمية {{Webarchive|url=https://web.archive.org/web/20170413071718/http://www.kettaneh.net/programming/c18.htm |date=13 أبريل 2017}} {{وصلة مكسورة|تاريخ=2020-08-02|bot=JarBot}}</ref> بمعنى أن الاسم هو مكان يحجز في الذاكرة يحتوى على عنوان أول عنصر فيها، ويمكن استخدام اسم المصفوفه كمؤشر تجرى عليه العمليات الخاصة بالمؤشرات.

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

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

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

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

== الأداء ==
<div class=tleft align=left>
{|class="wikitable"
!مقارنة!![[قائمة متصلة]]!![[مصفوفة (حوسبة)|مصفوفة]]!! مصفوفة ديناميكية!!Balanced tree 
|-
|فهرسة
|style="background:#ffdddd"|Θn 
|style="background:#ddffdd"|Θ1 
|style="background:#ddffdd"|Θ1 
|style="background:#ffffdd"|Θ log n 
|-
|إضافة إزالة عنصر في البداية
|style="background:#ddffdd"|Θ1 
|style="background:#ffffff"|N/A 
|style="background:#ffdddd"|Θn 
|style="background:#ffffdd"|Θ log n
|-
|إضافة إزالة عنصر في النهاية
|style="background:#ffffdd"|Θ n 
|style="background:#ffffff"|N/A 
|style="background:#ddffdd"|Θ1
|style="background:#ffffdd"|Θ log n
|-
|تضييع المساحة
|style="background:#ffdddd"|Θn 
|style="background:#ddffdd"|0 
|style="background:#ffdddd"|Θn 
|style="background:#ffdddd"|Θn 
|}
</div>
للحصول على أداء سريع في [[برنامج (حاسوب)|البرامج]]، فإنه من المهم فهم الآثار المترتبة على خطوة ملئ المجموعة الجديدة بقيمة افتراضية وعملية نسخ العناصر. كلما قمت بتغيير حجم المصفوفة الديناميكية <ref>"بنى المعطيات- " [http://www.maastaar.com/index.php/read/367/%D9%85%D8%A7%20%D9%87%D9%8A%20%D8%A8%D9%86%D9%89%20%D8%A7%D9%84%D9%85%D8%B9%D8%B7%D9%8A%D8%A7%D8%AA%20(Data%20Structure)%20%D8%9F مدونة ماستر] {{Webarchive|url=https://web.archive.org/web/20170725233026/http://www.maastaar.com/index.php/read/367/ما%20هي%20بنى%20المعطيات%20(Data%20Structure)%20؟ |date=25 يوليو 2017}}</ref>، سيتم نسخ مجموعة، وهو ما يعني بالتكرار الحجز والتحرير في الذاكرة، سيأخذ هذا وقت يتناسب مع حجم <ref>تغيير حجم الأمثل في الزمان والمكان ([https://cs.uwaterloo.ca/research/tr/1999/09/CS-99-09.pdf التقرير الفني] CS-99-09) {{Webarchive|url=https://web.archive.org/web/20160530170741/https://cs.uwaterloo.ca/research/tr/1999/09/CS-99-09.pdf |date=30 مايو 2016}}</ref> المصفوفة، فكلما زاد حجم المصفوفة زاد الوقت المطلوب لتغيير الحجم.

المصفوفة الديناميكية تمتلك العديد من المزايا عن المصفوفة العادية، في استخدام ذاكرة التخزين المؤقت للبيانات، الاكتناز (استخدام ذاكرة منخفضة)، والوصول العشوائي.. هذا يجعل المصفوفات الحيوية أداة جذابة لبناء هياكل البيانات سهلة في ذاكرة التخزين المؤقت. ومع ذلك، في لغات مثل [[بايثون (توضيح)|بايثون]] أو [[جافا (لغة برمجة)|جافا]]<ref>[https://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html وثائق الجافا] - اوراكل {{Webarchive|url=https://web.archive.org/web/20171103143354/https://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html |date=03 نوفمبر 2017}}</ref> التي تفرض دلالات مرجعية، المصفوفة الديناميكية عموما لن تخزن البيانات فعليا، بل سيتم تخزين المؤشر إلى العنصر المتواجد في مناطق أخرى من الذاكرة. في هذه الحالة، سوف لن تترتب العناصر بشكل متجاور في الذاكرة، ويتم فقدان العديد من المزايا من تخص ذاكرة التخزين المؤقت.
== مراجع ==

{{مراجع}}
{{بنى بيانات}}
{{شريط بوابات|برمجة الحاسوب|تقنية المعلومات|علم الحاسوب}}

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

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

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

 طريقة العمل 

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

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

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

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

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

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

 إذا كان هناك مساحة في الذاكرة كافية بعد آخر عنصر في المجموعة، فقط الخطوة رقم 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 
للحصول على أداء سريع في البرامج، فإنه من المهم فهم الآثار المترتبة على خطوة ملئ المجموعة الجديدة بقيمة افتراضية وعملية نسخ العناصر. كلما قمت بتغيير حجم المصفوفة الديناميكية "بنى المعطيات- " مدونة ماستر ، سيتم نسخ مجموعة، وهو ما يعني بالتكرار الحجز والتحرير في الذاكرة، سيأخذ هذا وقت يتناسب مع حجم تغيير حجم الأمثل في الزمان والمكان (التقرير الفني CS-99-09)  المصفوفة، فكلما زاد حجم المصفوفة زاد الوقت المطلوب لتغيير الحجم.

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

تصنيف:أنواع البيانات
تصنيف:بنى البيانات