ما هي المصفوفة (Array)؟
المصفوفة (array) بنية بيانات تخزّن مجموعة من القيم من النوع نفسه في كتلة متصلة واحدة من الذاكرة. ويُوصَل إلى كل قيمة، وتُسمّى عنصرًا، برقم موقعها، ويُسمّى الفهرس (index)، ويبدأ من 0 في معظم اللغات.
آخر تحديث 24 سبتمبر 2026
تطبيق الطقس الذي يعرض درجات حرارة الأسبوع يحتاج إلى سبعة أعداد. يمكنه استخدام سبعة متغيرات منفصلة، monday وtuesday وهكذا، لكن حينها لن تستطيع أي حلقة المرور عليها، وإضافة يوم ثامن تعني كتابة كود جديد. المصفوفة تضع الأعداد السبعة كلها تحت اسم واحد، temperatures، في خانات مرقّمة من 0 إلى 6.
كيف تعمل المصفوفة
تحتفظ المصفوفة بعناصرها متجاورة في كتلة واحدة من الذاكرة، وكل عنصر يشغل عدد البايتات نفسه. وهذا الترتيب يتيح للحاسوب إيجاد أي عنصر بعملية حسابية واحدة:
address of element i = start address + i × element size
لنفترض أن مصفوفة من الأعداد الصحيحة بحجم 32 بت (4 بايتات لكل عدد) تبدأ عند عنوان الذاكرة 1000. العنصر 0 عند 1000، والعنصر 1 عند 1004، والعنصر 2 عند 1008، والعنصر 3 عند 1012. والوصول إلى العنصر 3 أو العنصر 3,000,000 يستغرق الخطوة الواحدة نفسها، ولهذا تُسمّى قراءة المصفوفة بالفهرس عملية ذات زمن ثابت، وتُكتب O(1).
تخزّن وحدة array في Python الأعداد الخام بهذه الطريقة، فيمكنك التحقق من الحساب:
4 bytes per element
16 bytes in total
scores[0] = 90 at address 1000
scores[1] = 75 at address 1004
scores[2] = 88 at address 1008
scores[3] = 62 at address 1012
وتفسّر هذه الصيغة أيضًا سبب بدء العدّ من 0 في معظم اللغات. الفهرس إزاحة: عدد العناصر التي تتخطاها من البداية. العنصر الأول يبعد 0 عناصر عن البداية، لذا فهرسه 0، والعنصر الأخير في مصفوفة طولها n فهرسه n − 1. وبعض اللغات القليلة، مثل Lua وMATLAB وR وFortran، تبدأ من 1 بدلًا من ذلك.
استخدام المصفوفة في Python
معظم كود Python يستخدم النوع المدمج list كمصفوفة. تُنشئها بالأقواس المربعة، وتقرأ العناصر وتغيّرها بالفهرس، وتعرف طولها بالدالة len():
18
25
19
5
[18, 22, 25, 23, 19, 20]
الفهرس السالب يعدّ من النهاية، فـ temperatures[-1] هو العنصر الأخير. وهذا الاختصار خاص بـ Python؛ فلا توجد فهارس سالبة في C ولا Java.
كلفة العمليات على المصفوفة
الترتيب المتصل يجعل بعض العمليات سريعة وأخرى بطيئة. وتزداد الكلفة مع n، أي عدد العناصر:
| العملية | مثال في Python | الكلفة |
|---|---|---|
| قراءة عنصر أو تغييره بالفهرس | a[3] = 7 | O(1)، خطوة واحدة |
| إضافة عنصر في النهاية | a.append(7) | O(1) في المتوسط |
| الإدراج أو الحذف في البداية | a.insert(0, 7) | O(n)، كل عنصر يُزاح |
| البحث عن قيمة في مصفوفة غير مرتبة | 7 in a | O(n)، يفحص العناصر واحدًا تلو الآخر |
| البحث عن قيمة في مصفوفة مرتبة | البحث الثنائي | O(log n) |
الإدراج في البداية بطيء لأن كل عنصر يجب أن ينتقل خانة واحدة لإفساح المكان. والبحث في مصفوفة غير مرتبة يعني بحثًا خطيًا يمر على كل عنصر بالترتيب، بينما تسمح المصفوفة المرتبة بـالبحث الثنائي، الذي يقسم النطاق المتبقي إلى النصف في كل خطوة.
المرور على عناصر المصفوفة
المصفوفات والحلقات متلازمتان: الحلقة تزور كل عنصر بدوره، وهذا ما يُسمّى التكرار (iteration). والأسطر القليلة نفسها تتعامل مع مصفوفة من 5 عناصر أو من 5 ملايين عنصر.
Total: 28.5
Most expensive: 12.0
المصفوفات في اللغات الأخرى
في C، للمصفوفة حجم ثابت يُحدَّد عند الإعلان عنها، وتحمل قيمًا خامًا من نوع واحد. ويُبلغ sizeof عن حجمها بالبايتات:
int scores[5] = {90, 75, 88, 62, 100}; /* 5 × 4 bytes = 20 bytes */
مصفوفات Java أيضًا ذات طول ثابت، وتبدأ العناصر الجديدة بقيمة افتراضية مثل 0 للأعداد. وعندما تحتاج في Java إلى مصفوفة تكبر، تستخدم ArrayList:
int[] scores = new int[5]; // five elements, all 0
scores[0] = 90;
أما مصفوفات JavaScript فتكبر وتصغر بحرية ويمكن أن تخلط الأنواع، مثل [1, "two", true].
المصفوفات التي تكبر، مثل list في Python وArrayList في Java وstd::vector في C++، تُسمّى مصفوفات ديناميكية. وهي تحجز مساحة إضافية في نهايتها. وعندما تنفد هذه المساحة، تحجز كتلة أكبر، وتنسخ إليها كل العناصر، ثم تتابع. وعمليات النسخ هذه نادرة بما يكفي لتبقى الإضافة سريعة في المتوسط.
ويمكن للمصفوفة أيضًا أن تحمل مصفوفات أخرى. يقرأ grid[row][col] خلية واحدة من مصفوفة ثنائية الأبعاد، وهو الترتيب المستخدم في رقع الألعاب وجداول البيانات والصور. ويُظهر دليل C للمصفوفات متعددة الأبعاد كيف توضع في الذاكرة.
أخطاء شائعة
الخطأ بفارق واحد (off by one). المصفوفة ذات 3 عناصر فهارسها 0 و1 و2، فالفهرس 3 يقع بعد النهاية. وتتوقف Python مع خطأ:
IndexError: list index out of range
وتطلق Java الاستثناء ArrayIndexOutOfBoundsException، وتُرجع JavaScript بصمت undefined. أما C فلا تفحص شيئًا على الإطلاق: القراءة بعد النهاية سلوك غير معرَّف (undefined behavior)، قد يعيد قيمًا عشوائية أو يُسقط البرنامج مع خطأ التجزئة.
النسخ بالإسناد. في Python وJava وJavaScript، لا ينسخ b = a المصفوفة؛ فالاسمان يشيران إلى المصفوفة نفسها، وتغيير b يغيّر a. استخدم a.copy() في Python أو [...a] في JavaScript للحصول على نسخة حقيقية. وتشرح صفحة المتغير السبب.
إلى أين بعد ذلك
المصفوفة لا تفيد إلا مع حلقة تمر عليها، لذا اقرأ ما هو التكرار بعد ذلك، وما هو البايت لتعرف الوحدة وراء أحجام العناصر السابقة. ويشرح دليل القوائم في Python التقطيع والترتيب ودوال القوائم، ويُظهر التمثيل المرئي للقائمة المترابطة البنية التي تتخلى عن سرعة الوصول بالفهرس مقابل سرعة الإدراج.
الأسئلة الشائعة
ما هي المصفوفة في الرياضيات؟
ما هو مثال على المصفوفة؟
[18, 21, 25, 23, 19, 17, 20]، مصفوفة من سبعة أعداد، وtemperatures[0] هي قيمة يوم الاثنين. ومن الأمثلة اليومية الأخرى وحدات البكسل في صف من صورة، وأحرف سلسلة نصية، ونتائج اللاعبين في لوحة صدارة لعبة.كيف أشرح المصفوفة لطفل؟
ماذا تحتوي المصفوفة؟
int كلها أو double كلها. أما قوائم Python ومصفوفات JavaScript فيمكن أن تخلط الأنواع، لأنها تخزّن مراجع إلى القيم بدلًا من القيم نفسها.ما الفرق بين المصفوفة والقائمة؟
list المدمج في Python ليس قائمة مترابطة: إنه مصفوفة ديناميكية تكبر كلما أضفت عناصر.