0Pricing
Competitive Programming Academy · درس

دمج الفواصل المتداخلة

دمج النطاقات المتلامسة أو المتداخلة

دمج الفواصل المتداخلة درس مجاني في Competitive Programming Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Competitive Programming Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Competitive Programming Academy 4 دروس في المجموع.

هدف الدمج

عند إعطائكم فترات كثيرة، تريدون دمج الفترات المتلامسة أو المتداخلة في أقل عدد ممكن من النطاقات غير المتداخلة. 🧩

متى تتداخل فترتان

تتداخل فترتان عندما تبدأ إحداهما قبل أن تنتهي الأخرى. وبعد الترتيب حسب البداية، يعني ذلك أن تكون بداية الفترة التالية أصغر من النهاية الحالية أو مساوية لها.

رتّبوا أولًا دائمًا

لا ينجح الدمج من اليسار إلى اليمين إلا إذا كانت الفترات مرتبة، لذا ابدؤوا بترتيبها حسب البداية. وهذا هو أساس عملية المرور كلها.

intervals.sort(key=lambda x: x[0])

احتفظوا بنطاق حالي

مرّروا على القائمة المرتبة مع الاحتفاظ بفترة مدمجة حالية واحدة. فإما أن تمددها كل فترة جديدة، أو تبدأ نطاقًا جديدًا.

مدّدوا عند التداخل

إذا كانت البداية التالية ضمن النطاق الحالي، فهناك تداخل؛ لذا مدّدوا النهاية الحالية إلى الأكبر بين النهايتين.

cur_end = max(cur_end, end)

اختاروا النهاية العظمى

استخدموا دائمًا max للنهاية الجديدة. فالفترة القصيرة الواقعة داخل فترة طويلة يجب ألا تصغّر النطاق الذي بنيتموه.

أغلقوا نطاقًا وافتحوا آخر

إذا تجاوزت البداية التالية النهاية الحالية، فهناك فجوة. أضيفوا النطاق المكتمل إلى إجابتكم وابدؤوا فترة حالية جديدة.

result.append([cur_start, cur_end])

لا تنسوا الأخيرة

تبني الحلقة النطاق الأخير لكنها لا تضيفه. بعد انتهاء الحلقة، نفّذوا append للفترة الحالية الأخيرة حتى لا تضيع.

احتساب التلامس كتداخل

حدّد ما إذا كان ينبغي دمج [1, 3] و[3, 5]. يحدث ذلك عادةً، لذا استخدم start <= cur_end. اقرأ نص المسألة للتأكد من قاعدة الحافة هذه.

المسح الكامل

تمنحك تمريرة واحدة بعد الفرز جميع النطاقات المدمجة، لذا تعمل الطريقة بأكملها بتعقيد O(n log n)، إذ يأتي الجزء الأكبر من الفرز، ثم تُجرى عملية مسح خطية.

for s, e in intervals[1:]:
    if s <= cur_end:
        cur_end = max(cur_end, e)
    else:
        result.append([cur_start, cur_end]); cur_start, cur_end = s, e

استخدام شائع

يدعم الدمج تقاويم المواعيد وأنظمة الحجز: إذ يدمج فترات الانشغال لرؤية الوقت المتاح فعليًا. وتخفي كثير من مسائل المسابقات هذا النمط نفسه.

تحقق سريع

تدمج الفترات الزمنية بعد فرزها حسب وقت البدء.

مراجعة

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

الأسئلة الشائعة

هل درس «دمج الفواصل المتداخلة» مجاني؟

نعم — نص درس «دمج الفواصل المتداخلة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Competitive Programming Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Competitive Programming Academy 4 دروس في المجموع.

ماذا ستتعلم في «دمج الفواصل المتداخلة»؟

دمج النطاقات المتلامسة أو المتداخلة تتمرن على Competitive Programming Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Competitive Programming Academy؟

لا تُشترط خبرة سابقة. Competitive Programming Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «دمج الفواصل المتداخلة»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Competitive Programming Academy هذا؟

نعم. كل درس في Competitive Programming Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. ترتيب الفواصل حسب البداية
  2. دمج الفواصل المتداخلة
  3. اكتساح الخط لأقصى تداخل
  4. أقل عدد من الإزالات لمنع التداخل
← العودة إلى Competitive Programming Academy