الخلاصة والمصادر
الخلاصة النهائية
- 1. مثلث باسكال: ابنِ تدريجيًا على ما حسبته قبل:
row[i] = prev[i-1] + prev[i]. الطرفان ثابتان، والحلقة الداخليةrange(1, row_index)، والجواب عندn <= 0هو[]. وحد التعقيدO(n²)يحدده حجم المخرج لا ذكاء الخوارزمية. - 2. الصناديق المقفلة: ترجم القصة إلى بنية: الصندوق عقدة والمفتاح سهم، والسؤال قابلية وصول. المجموعة
openedتمنع الدوران وتتولّى العدّ، وشرط0 <= key < nيحميك من المفاتيح بلا صناديق، والجوابlen(opened) == n. - 3. أقل عدد من العمليات: اللصق يضرب لا يجمع، وضرب العدد في
kيكلّفkعملية بالضبط، والتجزئة إلى عوامل أولية لا تكون أسوأ أبدًا لأنa+b <= a·b. فالجواب هو مجموع العوامل الأولية، و0عندn <= 1. - 4. تحليل السجلات: التيّار يُقرأ سطرًا سطرًا بذاكرة ثابتة، والفهرسة من النهاية تتجاوز الحقول متغيّرة الطول، والعدّاد يزيد للأسطر الصحيحة فقط، و
except KeyboardInterruptلاfinallyللمقاطعة، وsorted(counts)تضمن الترتيب التصاعدي. - 5. التحقّق من UTF-8: عدد الواحدات في بداية البايت الأول هو طول الحرف، والمتابعة دائمًا
10xxxxxx، وnum & 0xFFلأننا نتعامل مع أقل 8 بتّات، وافحص من الأقصر إلى الأطول، وcontinuation == 0في النهاية هو ما يرفض التسلسل المقطوع. - 6. مسألة الملكات الـN: ملكة واحدة لكل صف تحذف نصف المسألة، وثابتا القطر
row-colوrow+colيجعلان الفحص فوريًا. والتراجع يقطع الفرع المستحيل مبكرًا: 15,720 موضعًا بدل 16.7 مليون ترتيب عندN=8. ولا تنسَ التنظيف بعد كل استدعاء.
الخيط الذي يربط الخمسةكل مسألة من هذه الخمس كانت أسهل بعد إعادة صياغتها: جدول، رسم بياني، تحليل عوامل، تيّار، آلة حالات. الكود جاء في النهاية وكان قصيرًا دائمًا. التفكير قبل الكتابة ليس نصيحة أخلاقية، هو ما يحدّد طول حلك وصحّته.
المعجم الكامل
| المصطلح | التعريف | الجزء |
|---|---|---|
| الاستدلال التدريجي (incremental build) | بناء النتيجة خطوة بخطوة من نتائج محسوبة سابقًا، بدل إعادة الحساب من الصفر | 1 |
| خطأ الواحد الزائد (off-by-one) | حدود حلقة أو فهرس تزيد أو تنقص بواحد، أشهر خطأ في العمل على المصفوفات | 1 |
التوافيق C(n,k) | عدد طرق اختيار k عنصرًا من n بلا ترتيب؛ وهو بالضبط قيمة الخلية في مثلث باسكال | 1 |
| الرسم البياني الموجّه | مجموعة عقد بينها أسهم في اتجاه واحد؛ الصندوق عقدة والمفتاح سهم | 2 |
| قابلية الوصول (reachability) | هل توجد سلسلة أسهم من عقدة البداية إلى عقدة معيّنة؟ | 2 |
| البحث عمقًا أولًا (DFS) | استكشاف فرع إلى آخره قبل الرجوع؛ يُنفَّذ بمكدّس أو باستدعاء ذاتي | 2 |
| البحث عرضًا أولًا (BFS) | استكشاف كل الجوار القريب أولًا؛ يُنفَّذ بـ deque وهو ما يعطي أقصر مسار | 2 |
المجموعة set | بنية تفحص العضوية في زمن ثابت تقريبًا؛ اختيارها بدل القائمة يحوّل O(n²) إلى O(n) | 2 |
| العامل الأولي | عدد أولي يقسم العدد؛ وتحليل العدد إلى عوامله الأولية وحيد لكل عدد | 3 |
| الجواب المغلق (closed form) | صيغة تحسب النتيجة مباشرة بلا بحث ولا تكرار، مثل «مجموع العوامل الأولية» هنا | 3 |
| القوة الغاشمة (brute force) | تجربة كل الاحتمالات؛ صحيحة دائمًا وبطيئة غالبًا، وتُستخدم كمرجع للتحقّق | 3 |
| التيّار (stream) | مصدر بيانات لا تعرف طوله مقدمًا ويُقرأ تدريجيًا؛ sys.stdin مثاله | 4 |
| المُجمِّع (accumulator) | متغيّر يحمل النتيجة التراكمية أثناء المرور على البيانات مرة واحدة | 4 |
KeyboardInterrupt | استثناء يرفعه بايثون عند Ctrl+C؛ يُلتقط بـ except ثم يُعاد رفعه بـ raise | 4 |
حارس __main__ | شرط if __name__ == "__main__" يمنع تنفيذ الكود عند الاستيراد | 4 |
| البت والبايت | البت خانة ثنائية (0 أو 1) والبايت ثمانية بتّات، أي قيمة من 0 إلى 255 | 5 |
الإزاحة >> | دفع البتّات يمينًا لحذف ما لا تريد فحصه؛ byte >> 7 يبقي أول بت | 5 |
القناع & 0xFF | عملية تُبقي أقل 8 بتّات وترمي الباقي، فيصير 256 مثلًا 0 | 5 |
| الترميز متغيّر الطول | تشفير يستخدم عددًا مختلفًا من البايتات لكل رمز بحسب شيوعه، وهو ما يفعله UTF-8 | 5 |
| بايت المتابعة | بايت يكمل حرفًا بدأه بايت قبله، ونمطه دائمًا 10xxxxxx | 5 |
| المزامنة الذاتية | خاصية الترميز التي تتيح معرفة بداية الرمز التالي من أي موضع، بلا قراءة من الأول | 5 |
| آلة الحالات (state machine) | متغيّر واحد يحفظ «أين أنا في المعالجة» وقواعد انتقال بين الحالات | 5 |
| التراجع (backtracking) | بناء الحل خطوة خطوة والرجوع فورًا حين يصير الجزء الحالي مستحيلًا، فيُقطع فرع كامل من الاحتمالات | 6 |
| التقليم (pruning) | استبعاد فرع من شجرة البحث قبل استكشافه، لأن قيدًا أثبت أنه لا يقود إلى حل | 6 |
| شجرة البحث | تمثيل الاحتمالات كشجرة: كل مستوى قرار، وكل فرع خيار؛ والتراجع يمشي فيها عمقًا أولًا | 6 |
ثابت القطر row-col | قيمة لا تتغيّر على امتداد القطر ↘، فتُستعمل للتعرّف عليه بعدد واحد بدل المرور على المربعات | 6 |
ثابت القطر row+col | نظيرتها للقطر ↙: المجموع ثابت على امتداده | 6 |
| التنظيف بعد الاستدعاء | إلغاء أثر الخطوة (الحذف من المجموعات ورفع الملكة) قبل الرجوع، وهو ما يجعل التراجع صحيحًا | 6 |
| المنقول | تبديل الصفوف بالأعمدة: m[r][c] ↔ m[c][r]. | 7 |
| في المكان | تعديل نفس البيانات دون نسخة جديدة. | 7 |
| zip(*m) | طريقة بايثون المختصرة لأخذ أعمدة الشبكة. | 7 |
| البرمجة الديناميكية | حفظ أجوبة المسائل الأصغر والبناء عليها. | 8 |
| الحالة الأساسية | أصغر مسألة جوابها معروف، مثل المبلغ 0. | 8 |
| الجشع | أخذ الأفضل محليًا في كل خطوة. | 8 |
| Promise | وعد بقيمة ستصل لاحقًا أو خطأ. | 9 |
| Promise.all | ينتظر الكل ويحفظ ترتيب المدخلات. | 9 |
| allSettled | ينتظر الكل ويعيد نجاح أو فشل كل واحد. | 9 |
| DIRS | قائمة الاتجاهات الأربعة لتجنّب تكرار الكود. | 10 |
| فحص الحدود | 0 <= nr < rows و0 <= nc < cols قبل القراءة. | 10 |
| DFS | البحث بالعمق: اذهب لأبعد نقطة ثم ارجع. | 10 |
| عدد أولي | عدد أكبر من 1 لا يقسمه إلا 1 ونفسه. | 11 |
| الغربال | شطب مضاعفات كل أولي، فيبقى الأولي. | 11 |
| مجموع بادئ | prefix[i] = مجموع العناصر حتى i، لأسئلة النطاق في O(1). | 11 |
مصادر هذا الدرس
مرتّبة بالنوع. ابدأ بالتوثيق الرسمي إذا تبي المرجع الدقيق، وبالمقال أو الفيديو إذا تبي الشرح أولًا.
أدوات2
خلّصت الدرس؟
سجّل الدخول ليُحفظ تقدّمك.