هياكل البيانات
هيكل البيانات طريقة لتنظيم البيانات في الذاكرة بحيث تكون عمليات معينة سريعة. اختيار الهيكل المناسب يحدد غالباً أداء البرنامج أكثر من أي تحسين آخر. التعقيدات أدناه بترميز O الكبير، انظر الخوارزميات.
مقارنة سريعة
| الهيكل | الوصول بالفهرس | البحث | الإضافة | الحذف |
|---|---|---|---|---|
| مصفوفة ديناميكية | O(1) | O(n) | O(1) مُطفأة في النهاية | O(n) |
| قائمة مترابطة | O(n) | O(n) | O(1) عند عقدة معروفة | O(1) عند عقدة معروفة |
| جدول تجزئة | — | O(1) متوسط | O(1) متوسط | O(1) متوسط |
| شجرة بحث متوازنة | — | O(log n) | O(log n) | O(log n) |
| كومة (heap) | — | O(n) | O(log n) | O(log n) للأصغر |
المكدس والطابور
- المكدس (Stack): آخر داخل أول خارج (LIFO). مثل التراجع في المحررات واستدعاءات الدوال.
- الطابور (Queue): أول داخل أول خارج (FIFO). مثل معالجة المهام بالترتيب.
from collections import deque
stack = []; stack.append(1); stack.pop()
queue = deque(); queue.append(1); queue.popleft() # O(1) بخلاف list.pop(0)
جداول التجزئة
تربط مفتاحاً بقيمة عبر دالة تجزئة: dict في Python وMap في JavaScript. مثالية للبحث السريع وعدّ التكرارات وإزالة المكررات (set).
الأشجار
- شجرة البحث الثنائية: كل عقدة أكبر من يسارها وأصغر من يمينها. يجب أن تبقى متوازنة (مثل AVL أو الشجرة الحمراء-السوداء) وإلا تتحول في أسوأ حالة إلى قائمة بتعقيد O(n).
- الكومة: الأصغر (أو الأكبر) دائماً في القمة؛ أساس طوابير الأولوية (
heapqفي Python). - B-Tree: ما تستخدمه قواعد البيانات للفهارس.
الرسوم البيانية (Graphs)
عقد وحواف، مثل شبكة طرق أو علاقات متابعة. تُمثَّل غالباً بقائمة تجاور:
graph = {"A": ["B", "C"], "B": ["D"], "C": ["D"], "D": []}
كيف تختار؟
اسأل: ما العملية الأكثر تكراراً؟ بحث بالمفتاح ← جدول تجزئة. ترتيب دائم ← شجرة متوازنة. أصغر عنصر دائماً ← كومة. وصول بالفهرس ← مصفوفة.