مختصر كتابي: حل المثال يدويًا وكتابة خطوات الحل
Summary: Manual Walkthrough and Pseudocode
كيف تحوّل حلّك اليدوي لمثال إلى خطوات دقيقة يستطيع البرنامج تنفيذها؟
نعود إلى مسألة حجوزات القاعة: لدينا قائمة مواعيد، ونريد أن نعرف هل يتعارض أي حجزين فيها، مع العلم أن الحجز الذي يبدأ لحظة انتهاء آخر لا يُعدّ تعارضًا. نبدأ بـالحل اليدوي للمثال (Manual Walkthrough) على 3 حجوزات: A من 9 إلى 10، وB من 11 إلى 12، وC من 9:30 إلى 10:30. إذا رسمتها على خط زمني (Timeline) ستلاحظ أن A وC يتداخلان من 9:30 إلى 10، فالنتيجة المتوقعة true.
لكن كيف عرفت الإجابة؟ قارنت الفترات بنظرك. والمطلوب الآن تحويل هذه المقارنة إلى قاعدة دقيقة.
ابدأ بسؤال أصغر: متى يتعارض حجزان فقط؟ فكّر أولًا في حالات عدم التعارض: أن ينتهي الأول قبل بداية الثاني أو لحظة بدايته، أو العكس. فإن لم تحدث أيّ منها، فهناك فترة يشترك فيها الحجزان. لذلك يكون شرط التعارض (Overlap Condition): بداية الحجز الأول أصغر من نهاية الثاني، وبداية الحجز الثاني أصغر من نهاية الأول، والشرطان مرتبطان بـ«و» المنطقية (Logical And).
طبّق القاعدة على A (540–600) وB (660–720): الشرط الأول متحقق لأن 540 أصغر من 720، لكن الثاني غير متحقق لأن 660 ليس أصغر من 600؛ فلا تعارض. لاحظ أن اختبار شرط واحد فقط كان سيعطيك إجابة خاطئة. أما A وC (570–630) فالشرطان متحققان، فهناك تعارض، ويمكننا إرجاع true وإنهاء البحث فورًا، وهذا ما يسمى الإرجاع المبكر (Early Return).
وفي حالة تلامس الحدود (Touching Boundaries)، حين ينتهي حجز عند 600 ويبدأ آخر عند 600، نسأل: هل 600 أصغر من 600؟ لا، فلا تعارض. لهذا استخدمنا «أصغر من» (Less Than) دون علامة المساواة؛ فاختيار علامة المقارنة نابع من معنى المسألة. وفي حالة الاحتواء (Containment)، كحجز من 9 إلى 12 بداخله حجز من 10 إلى 11، يتحقق الشرطان فنكتشف التعارض أيضًا.
ولتطبيق القاعدة على القائمة كلها نفحص كل زوج مختلف (Distinct Pair): لا نقارن الحجز بنفسه، ولا نقارن B مع A بعد أن قارنّا A مع B. ثم نكتب الفكرة بـالشيفرة الوصفية (Pseudocode)، أي خطوات الحل دون التقيّد بقواعد كتابة Java:
- مرّ على كل زوج مختلف من الحجوزات.
- إذا كان في الزوج تعارض، أرجِع
true. - بعد فحص كل الأزواج دون تعارض، أرجِع
false.
- مكان
falseمهم جدًا: عدم التعارض في أول زوج لا يضمن سلامة القائمة كلها. - القائمة الفارغة أو ذات الحجز الواحد لا تحتوي أزواجًا، فتكون النتيجة
false. - التنفيذ اليدوي خطوة بخطوة (Dry Run): اختر الزوج، واحسب الشرطين، وسجّل القرار، ثم انتقل للزوج التالي إن لزم.
- القائمة غير المرتبة ذات المواعيد المتتالية تعطي
false.
الخلاصة: حوّلت ملاحظة بصرية على الرسم إلى شرط تعارض من جزأين يُطبَّق على كل زوج مختلف، مع إرجاع مبكر عند أول تعارض وإرجاع false بعد فحص كل الأزواج.
