جولة في أشهر تراكيب البيانات
سبعة تراكيب ستتعمق فيها خلال المقرر، وأين تقابل كلًّا منها في حياتك. ⏱ نحو 25 دقيقة.
- تميّز التراكيب الخطية وغير الخطية وجداول التجزئة.
- تشرح فكرة المصفوفة والقائمة المترابطة والمكدس والطابور والشجرة والرسم.
- تمثّل المكدس بـ
listوالطابور بـdeque. - تربط كل تركيب بتطبيق حقيقي.
١التراكيب نوعان
| النوع | الفكرة | أمثلة |
|---|---|---|
| خطّية Linear | العناصر في صف واحد: لكل عنصر سابق ولاحق. | المصفوفة، القائمة المترابطة، المكدس، الطابور |
غير خطّية Non-linear | العنصر قد يرتبط بأكثر من عنصر. | الشجرة، الرسم البياني |
| جداول التجزئة Hash Table | مفتاح يتحول إلى رقم خانة مباشرة. | dict و set في بايثون |
٢المصفوفة والقائمة المترابطة
المصفوفة Array: خانات متجاورة في الذاكرة. ميزتها: الوصول إلى الخانة رقم 3 فوري. وعيبها: الإدراج في أولها يتطلب إزاحة كل العناصر. والقائمة list في بايثون مصفوفة ديناميكية تكبر وحدها.
القائمة المترابطة Linked List: كل عنصر «عقدة» تعرف العقدة التالية فقط. ميزتها: الإدراج في أولها سريع جدًّا. وعيبها: للوصول إلى العنصر الخامس تمر على الأربعة قبله. ستبنيها بنفسك في الدرس 13.
٣المكدس والطابور
# المكدس: صفحات زرتها في المتصفحhistory = []history.append("الرئيسية")history.append("الأخبار")history.append("الرياضة")print("رجوع من:", history.pop())print("الصفحة الحالية:", history[-1])
from collections import deque# الطابور: عملاء ينتظرون عند المحاسبline = deque()line.append("أحمد")line.append("سارة")line.append("خالد")print("دور:", line.popleft())print("الباقون:", list(line))
المكدس Stack: آخر ما دخل يخرج أولًا (LIFO)، مثل كومة الأطباق. والطابور Queue: أول ما دخل يخرج أولًا (FIFO)، مثل طابور الانتظار.
٤جدول التجزئة: القاموس
القاموس يحوّل المفتاح إلى رقم خانة بدالة اسمها دالة التجزئة hash، فيقفز إليها مباشرة دون بحث:
students = {441001: "أحمد", 441002: "محمد", 441003: "يوسف"}print(students[441002])print(441009 in students)
٥الشجرة والرسم البياني
# شجرة بسيطة بقاموس: كل عقدة ← قائمة أبنائهاtree = { "الكلية": ["البرمجة", "الشبكات"], "البرمجة": ["مقرر 111", "مقرر 101"], "الشبكات": ["مقرر 211"],}print(tree["البرمجة"])
# رسم بياني بقائمة الجوار: كل مدينة ← المدن المتصلة بهاroads = { "المدينة": ["ينبع", "بدر"], "ينبع": ["المدينة", "جدة"], "بدر": ["المدينة", "جدة", "مكة"], "جدة": ["ينبع", "بدر", "مكة"], "مكة": ["بدر", "جدة"],}print("طرق من بدر:", roads["بدر"])
٦أين نرى كل تركيب؟
| التركيب | تطبيق حقيقي |
|---|---|
| المصفوفة | درجات الطلاب، وبكسلات الصورة |
| القائمة المترابطة | قائمة تشغيل الأغاني: التالي والسابق |
| المكدس | زر التراجع Ctrl+Z، وزر الرجوع في المتصفح |
| الطابور | طابور الطباعة، وطلبات خادم الموقع |
| جدول التجزئة | البحث برقم الهوية، وتسجيل الدخول |
| الشجرة | مجلدات الحاسب، وصفحات HTML (شجرة DOM) |
| الرسم البياني | خرائط الطرق، وشبكات الأصدقاء |
توقّع وتحقّق
زر Ctrl+Z (تراجع) يعتمد على:
طابور الطباعة يعتمد على:
خريطة الطرق بين المدن تُمثَّل بـ:
الوصول إلى الخانة رقم 500 فوري في:
الخلاصة
- خطية: مصفوفة، قائمة مترابطة، مكدس، طابور. غير خطية: شجرة، رسم.
- المكدس
LIFO: appendوpop. الطابورFIFO: dequeمعappendوpopleft. - القاموس جدول تجزئة: المفتاح ← الخانة مباشرة.
- الشجرة جذر وأبناء بلا حلقات، والرسم عقد وأضلاع.
تحدٍّ برمجي: زر الرجوع في المتصفح
سهلالمستخدم زار الصفحات بالترتيب: الرئيسية، المنتجات، القهوة، السلة، ثم ضغط زر الرجوع مرتين. استخدم مكدسًا لتعرف الصفحة الحالية.
- أضف الصفحات الأربع إلى قائمة بـ append.
- نفّذ الرجوع مرتين بـ pop، واطبع كل صفحة تُغلق: أُغلقت: السلة
- في الأخير اطبع: الصفحة الحالية: المنتجات
ابدأ من هذا الكود، واضغط ▶ شغّل هنا لتكتب حلّك وتجرّبه مباشرة:
history = []💡 تلميح 1
history[-1] آخر عنصر في القائمة، أي قمة المكدس.💡 تلميح 2
pop() تحذف آخر عنصر وتُرجعه.حاول بنفسك أولًا؛ للمسألة أكثر من حلّ صحيح.
history = []for page in ["الرئيسية", "المنتجات", "القهوة", "السلة"]: history.append(page) for _ in range(2): print("أُغلقت:", history.pop()) print("الصفحة الحالية:", history[-1])