طَبِّقْهاتعلّم المبدأ، وطبّقه بيدكمقرر 101 · تركيب البيانات والخوارزميات
الدرس 1 · الوحدة 1: مقدمة في تراكيب البيانات والخوارزميات

ما تراكيب البيانات والخوارزميات؟

لماذا يجد تطبيق اسمًا بين مليون اسم في لحظة، ويتعثر آخر؟ ⏱ نحو 20 دقيقة.

بعد هذا الدرس ستستطيع أن:
  • تعرّف تركيب البيانات والخوارزمية والعلاقة بينهما.
  • تشرح لماذا يصنع اختيار التركيب فرقًا كبيرًا مع البيانات الكبيرة.
  • تعدّد صفات الخوارزمية الجيدة.
  • تقارن تراكيب بايثون الجاهزة وتختار المناسب منها.

١برنامجان يحلّان المشكلة نفسها

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

هذان هما موضوع المقرر كله:

المفهومتعريفهتشبيه
تركيب البيانات Data Structureطريقة لتنظيم البيانات في الذاكرة تجعل عمليات معينة عليها سهلة وسريعة.رفوف مكتبة مرتبة حسب الموضوع
الخوارزمية Algorithmخطوات محددة ومنتهية تحل مشكلة.طريقة البحث عن كتاب في تلك الرفوف

قال العالم نيكلاوس فيرث، مخترع لغة Pascal: «الخوارزميات + تراكيب البيانات = البرامج». فالتركيب الجيد يجعل الخوارزمية بسيطة وسريعة، والتركيب السيئ يجعل أذكى خوارزمية بطيئة.

٢الفرق يظهر مع البيانات الكبيرة

نعدّ كم خطوة نحتاج لنجد رقمًا في قائمة غير مرتبة، حين نفحص العناصر واحدًا واحدًا:

main.py
numbers = list(range(1, 1000001))   # مليون رقمtarget = 999999 steps = 0for x in numbers:    steps += 1    if x == target:        breakprint("عدد الخطوات:", steps)
Shell×
>>> %Run main.py
عدد الخطوات: 999999
>>>

وفي قاموس dict أو مجموعة set يقفز بايثون إلى العنصر مباشرة، بخطوة واحدة تقريبًا مهما كبر العدد. ستعرف السبب في درس جداول التجزئة:

main.py
numbers = set(range(1, 1000001))print(999999 in numbers)   # خطوة واحدة تقريبًا
Shell×
>>> %Run main.py
True
>>>

مليون خطوة مقابل خطوة واحدة. مع تطبيق يبحث آلاف المرات في الثانية، هذا هو الفرق بين تطبيق سريع وتطبيق متعطل.

٣صفات الخوارزمية الجيدة

الصفةمعناها
المدخلاتتستقبل صفرًا أو أكثر من القيم.
المخرجاتتنتج نتيجة واحدة على الأقل.
الوضوحكل خطوة دقيقة، لها معنى واحد فقط.
الانتهاءتتوقف بعد عدد محدود من الخطوات.
الصحةتعطي الناتج الصحيح لكل مدخل مسموح.
الكفاءةلا تستهلك وقتًا ولا ذاكرة أكثر من اللازم. وهذا ما سنقيسه في المقرر.

٤تراكيب بايثون الجاهزة

تعرفت في مقرر 111 على تراكيب جاهزة في بايثون. نراجعها الآن بنظرة جديدة: ما الذي يميز كل واحد؟

التركيبالشكلمرتب؟يُعدَّل؟يقبل التكرار؟الوصول
القائمة list[3, 1, 3]نعمنعمنعمبالموقع: a[0]
الصف tuple(3, 1, 3)نعملانعمبالموقع
القاموس dict{"علي": 90}بترتيب الإضافةنعمالمفاتيح لابالمفتاح: d["علي"]
المجموعة set{3, 1}لانعملاهل يوجد؟ x in s
main.py
marks = [90, 75, 90, 60]            # قائمة: ترتيب وتكرارpoint = (24.47, 39.61)               # صف: إحداثيات المدينة لا تتغيرphone = {"سعود": "0551", "نورة": "0552"}   # قاموس: اسم ← رقمcities = {"جدة", "الرياض", "جدة"}    # مجموعة: بلا تكرار print(marks[0], point[1])print(phone["نورة"])print(len(cities))
Shell×
>>> %Run main.py
90 39.61
0552
2
>>>

٥اختر التركيب حسب السؤال

السؤال المهم ليس «ما أفضل تركيب؟»، بل: ما العمليات التي سأكررها كثيرًا؟

تحتاج أن…التركيب المناسب
تحفظ عناصر بترتيبها وتصل إليها برقم موقعهاlist
تحفظ قيمًا ثابتة لا تتغيرtuple
تجد معلومة بمفتاحها بسرعة (رقم الطالب ← بياناته)dict
تعرف بسرعة هل العنصر موجود، أو تحذف التكرارset

توقّع وتحقّق

طريقة تنظيم البيانات في الذاكرة تسمى:

Data Structure.

أي تركيب يمنع التكرار تلقائيًّا؟

المجموعة.

رقم الطالب ← بياناته. أنسب تركيب:

بحث بالمفتاح.

الصفة التي تعني أن الخوارزمية تتوقف حتمًا:

عدد محدود من الخطوات.

الخلاصة

تحدٍّ برمجي: أعلى درجة وموقعها

سهل

لديك قائمة درجات. اكتب خوارزمية بنفسك (دون max) تجد أعلى درجة وموقعها في القائمة، وعدد المقارنات التي احتجتها.

المطلوب:
  • ابدأ بأول عنصر على أنه الأعلى.
  • مر على بقية العناصر وقارن، وعدّ كل مقارنة.
  • اطبع: أعلى درجة: 97 ثم الموقع: 4 ثم المقارنات: 6

ابدأ من هذا الكود، واضغط ▶ شغّل هنا لتكتب حلّك وتجرّبه مباشرة:

main.py
marks = [72, 88, 65, 90, 97, 81, 59]
المطلوب×
أعلى درجة: 97
الموقع: 4
المقارنات: 6
💡 تلميح 1
for i in range(1, len(marks)): تمر على المواقع من 1.
💡 تلميح 2
كل دورة فيها مقارنة واحدة: count += 1

حاول بنفسك أولًا؛ للمسألة أكثر من حلّ صحيح.

main.py
marks = [72, 88, 65, 90, 97, 81, 59] best = marks[0]pos = 0count = 0for i in range(1, len(marks)):    count += 1    if marks[i] > best:        best = marks[i]        pos = iprint("أعلى درجة:", best)print("الموقع:", pos)print("المقارنات:", count)
انتقل إلى تقييم الدرساختيار من متعدد، وصح وخطأ، وأكمل الفراغ، وتتبّع الناتج.ابدأ التقييم ←

📝 معلم؟ أرسل ملاحظة للمؤلف عن هذا الدرس