ما هي المصفوفة؟
- المصفوفة عبارة عن مجموعة من العناصر، يتم تحديد كل منها بواسطة فهرس أو مفتاح.
- المصفوفات لها حجم ثابت وديناميكي
- عناصر متجانسة → جميع العناصر في المصفوفة من نفس نوع البيانات.
- عناصر غير متجانسة → السماح بأنواع بيانات مختلفة في نفس المصفوفة.
// Homogeneous
int[] intArray = new int[5]; // Array of integers String[]
stringArray = new String[5]; // Array of strings
// Heterogeneous
mixedArray = [1, "hello", 3.14, True] # Mixed data types in one list
خصائص المصفوفات
- الفهرسة: الفهرسة الصفرية في معظم لغات البرمجة.
- الحجم: حجم ثابت (ثابت)، لا يمكن تغييره ديناميكيًا (باستثناء اللغات ذات المصفوفات الديناميكية).
- تخصيص الذاكرة: تخصيص الذاكرة المتجاورة لعناصر المصفوفة. مما يعني أن كل عنصر يقع مباشرة بجوار العنصر السابق في الذاكرة. وهذا ممكن لأن جميع العناصر لها نفس الحجم، مما يسمح للنظام بحساب عنوان الذاكرة لأي عنصر باستخدام الفهرس الخاص به.

عمليات المصفوفة
- الإدراج: يتضمن عادةً عناصر متغيرة، تعقيد الوقت O(n).
- الحذف: كما هو الحال مع الإدراج، قد تحتاج العناصر إلى النقل. باستثناء الفهرس الأخير
- الاجتياز: التكرار عبر جميع العناصر، تعقيد الوقت O(n).
- وقت الوصول: التعقيد الزمني O(1) للوصول إلى عنصر باستخدام فهرسه.
أنواع المصفوفات
- المصفوفة أحادية البعد: أبسط شكل، مثل القائمة.
- مصفوفة متعددة الأبعاد: مصفوفات من المصفوفات (على سبيل المثال، مصفوفة ثنائية الأبعاد).
- المصفوفة المسننة: مصفوفات ذات أطوال مختلفة للمصفوفات الفرعية.
- المصفوفات الديناميكية (على سبيل المثال، ArrayList في Java): المصفوفات التي يمكن أن تنمو في الحجم ديناميكيًا.
مزايا المصفوفات
- الكفاءة: O(1) وقت الوصول للعناصر.
- استخدام الذاكرة: الاستخدام الفعال للذاكرة بسبب التخزين المتجاور.
- سهولة الاستخدام: تبسيط إدارة البيانات والعمليات مثل الفرز والبحث
عيوب المصفوفات
- الحجم الثابت: لا يمكن تغيير الحجم بمجرد الإعلان عنه. باستثناء المصفوفة الديناميكية
- تكلفة الإدراج/الحذف: O(n) لإدراج عنصر أو حذفه، خاصة في المنتصف.
- إهدار الذاكرة: العناصر غير المستخدمة لا تزال تشغل مساحة.
تطبيقات العالم الحقيقي للمصفوفات
- تخزين البيانات: شائع في البرمجة لتخزين مجموعات من العناصر.
- خوارزميات الفرز: تم تصميم العديد من خوارزميات الفرز للمصفوفات (على سبيل المثال، QuickSort، MergeSort).
- عمليات المصفوفة: تستخدم المصفوفات ثنائية الأبعاد لعمليات المصفوفة في الرياضيات والرسومات.
- تنفيذ الأكوام وقوائم الانتظار: يمكن تنفيذ هياكل البيانات الأساسية باستخدام المصفوفات.
أفضل الممارسات مع المصفوفات
- تجنب النسخ غير الضرورية: انتبه للعمليات التي تتطلب نسخ العناصر.
- استخدم المصفوفات الديناميكية عند الحاجة: إذا كان الحجم غير مؤكد، ففضل المصفوفات الديناميكية.
- الاستفادة من الوظائف المضمنة: الاستفادة من الوظائف الخاصة باللغة لعمليات المصفوفة.
- فحص الحدود: تحقق دائمًا من شروط الحدود لتجنب IndexOutOfBoundsException.
مثال على المصفوفة الثابتة والديناميكية في GO
package main
import (
"fmt"
"unsafe"
)
func main() {
// Static Array
var staticArr [5]int64
staticArr[0] = 1
staticArr[1] = 2
staticArr[2] = 3
staticArr[3] = 4
staticArr[4] = 5
elementSize := unsafe.Sizeof(staticArr[0])
totalSize := elementSize * uintptr(len(staticArr))
fmt.Printf("Memory used by static array: %d bytes\n", totalSize)
fmt.Println()
// Dynamic Array (Slice)
dynamicArr := make([]int32, 0, 5)
before := unsafe.Sizeof(dynamicArr[0])
beforeTotal := before * uintptr(len(dynamicArr))
fmt.Printf("Memory used by dynamic array (before): %d bytes\n", beforeTotal)
// Append elements to dynamic array
for i := 0; i