ما تراكيب البيانات والخوارزميات؟
لماذا يجد تطبيق اسمًا بين مليون اسم في لحظة، ويتعثر آخر؟ ⏱ نحو 20 دقيقة.
- تعرّف تركيب البيانات والخوارزمية والعلاقة بينهما.
- تشرح لماذا يصنع اختيار التركيب فرقًا كبيرًا مع البيانات الكبيرة.
- تعدّد صفات الخوارزمية الجيدة.
- تقارن تراكيب بايثون الجاهزة وتختار المناسب منها.
١برنامجان يحلّان المشكلة نفسها
تطبيق جوال فيه مليون اسم في قائمة جهات الاتصال. كتبت «سعود» في البحث. برنامج يجد الاسم خلال جزء من الثانية، وآخر يجعلك تنتظر. كلاهما «صحيح»، لكن الأول اختار طريقة تنظيم للبيانات وطريقة بحث أذكى.
هذان هما موضوع المقرر كله:
| المفهوم | تعريفه | تشبيه |
|---|---|---|
| تركيب البيانات Data Structure | طريقة لتنظيم البيانات في الذاكرة تجعل عمليات معينة عليها سهلة وسريعة. | رفوف مكتبة مرتبة حسب الموضوع |
| الخوارزمية Algorithm | خطوات محددة ومنتهية تحل مشكلة. | طريقة البحث عن كتاب في تلك الرفوف |
قال العالم نيكلاوس فيرث، مخترع لغة Pascal: «الخوارزميات + تراكيب البيانات = البرامج». فالتركيب الجيد يجعل الخوارزمية بسيطة وسريعة، والتركيب السيئ يجعل أذكى خوارزمية بطيئة.
٢الفرق يظهر مع البيانات الكبيرة
نعدّ كم خطوة نحتاج لنجد رقمًا في قائمة غير مرتبة، حين نفحص العناصر واحدًا واحدًا:
numbers = list(range(1, 1000001)) # مليون رقمtarget = 999999 steps = 0for x in numbers: steps += 1 if x == target: breakprint("عدد الخطوات:", steps)
وفي قاموس dict أو مجموعة set يقفز بايثون إلى العنصر مباشرة، بخطوة واحدة تقريبًا مهما كبر العدد. ستعرف السبب في درس جداول التجزئة:
numbers = set(range(1, 1000001))print(999999 in numbers) # خطوة واحدة تقريبًا
مليون خطوة مقابل خطوة واحدة. مع تطبيق يبحث آلاف المرات في الثانية، هذا هو الفرق بين تطبيق سريع وتطبيق متعطل.
٣صفات الخوارزمية الجيدة
| الصفة | معناها |
|---|---|
| المدخلات | تستقبل صفرًا أو أكثر من القيم. |
| المخرجات | تنتج نتيجة واحدة على الأقل. |
| الوضوح | كل خطوة دقيقة، لها معنى واحد فقط. |
| الانتهاء | تتوقف بعد عدد محدود من الخطوات. |
| الصحة | تعطي الناتج الصحيح لكل مدخل مسموح. |
| الكفاءة | لا تستهلك وقتًا ولا ذاكرة أكثر من اللازم. وهذا ما سنقيسه في المقرر. |
٤تراكيب بايثون الجاهزة
تعرفت في مقرر 111 على تراكيب جاهزة في بايثون. نراجعها الآن بنظرة جديدة: ما الذي يميز كل واحد؟
| التركيب | الشكل | مرتب؟ | يُعدَّل؟ | يقبل التكرار؟ | الوصول |
|---|---|---|---|---|---|
القائمة list | [3, 1, 3] | نعم | نعم | نعم | بالموقع: a[0] |
الصف tuple | (3, 1, 3) | نعم | لا | نعم | بالموقع |
القاموس dict | {"علي": 90} | بترتيب الإضافة | نعم | المفاتيح لا | بالمفتاح: d["علي"] |
المجموعة set | {3, 1} | لا | نعم | لا | هل يوجد؟ x in s |
marks = [90, 75, 90, 60] # قائمة: ترتيب وتكرارpoint = (24.47, 39.61) # صف: إحداثيات المدينة لا تتغيرphone = {"سعود": "0551", "نورة": "0552"} # قاموس: اسم ← رقمcities = {"جدة", "الرياض", "جدة"} # مجموعة: بلا تكرار print(marks[0], point[1])print(phone["نورة"])print(len(cities))
٥اختر التركيب حسب السؤال
السؤال المهم ليس «ما أفضل تركيب؟»، بل: ما العمليات التي سأكررها كثيرًا؟
| تحتاج أن… | التركيب المناسب |
|---|---|
| تحفظ عناصر بترتيبها وتصل إليها برقم موقعها | list |
| تحفظ قيمًا ثابتة لا تتغير | tuple |
| تجد معلومة بمفتاحها بسرعة (رقم الطالب ← بياناته) | dict |
| تعرف بسرعة هل العنصر موجود، أو تحذف التكرار | set |
توقّع وتحقّق
طريقة تنظيم البيانات في الذاكرة تسمى:
Data Structure.أي تركيب يمنع التكرار تلقائيًّا؟
رقم الطالب ← بياناته. أنسب تركيب:
الصفة التي تعني أن الخوارزمية تتوقف حتمًا:
الخلاصة
- تركيب البيانات: تنظيم البيانات. الخوارزمية: خطوات الحل.
- الخوارزميات + تراكيب البيانات = البرامج.
- صفات الخوارزمية: مدخلات ومخرجات ووضوح وانتهاء وصحة وكفاءة.
listللترتيب والموقع، وtupleللثابت، وdictللبحث بالمفتاح، وsetللوجود وحذف التكرار.
تحدٍّ برمجي: أعلى درجة وموقعها
سهللديك قائمة درجات. اكتب خوارزمية بنفسك (دون max) تجد أعلى درجة وموقعها في القائمة، وعدد المقارنات التي احتجتها.
- ابدأ بأول عنصر على أنه الأعلى.
- مر على بقية العناصر وقارن، وعدّ كل مقارنة.
- اطبع: أعلى درجة: 97 ثم الموقع: 4 ثم المقارنات: 6
ابدأ من هذا الكود، واضغط ▶ شغّل هنا لتكتب حلّك وتجرّبه مباشرة:
marks = [72, 88, 65, 90, 97, 81, 59]💡 تلميح 1
for i in range(1, len(marks)): تمر على المواقع من 1.💡 تلميح 2
count += 1حاول بنفسك أولًا؛ للمسألة أكثر من حلّ صحيح.
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)