الانتشار الكسول لتحديثات النطاق
تأجيل التحديثات على نطاقات كاملة
الانتشار الكسول لتحديثات النطاق درس مجاني في Coding Interview Prep على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Coding Interview Prep، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Coding Interview Prep 4 دروس في المجموع.
مشكلة تحديث النطاق
ماذا لو طلب استعلام إضافة 5 إلى كل عنصر من l إلى r؟ إن لمس كل ورقة يستغرق O(n) لكل تحديث، وهو بطيء جدًا عند إجراء الكثير من تحديثات النطاق. 😰
فكرة التأجيل
يتيح Lazy propagation للعقدة تذكّر تغيير معلّق من دون دفعه إلى الأبناء بعد. ويُؤجَّل العمل حتى تحتاج فعليًا إلى هؤلاء الأبناء.
مصفوفة ثانية للعمل المعلّق
نحتفظ إلى جانب الشجرة بمصفوفة lazy. تخزّن lazy[node] تحديثًا ينطبق على النطاق الكامل لتلك العقدة، لكنه لم يُدفع إلى الأسفل بعد.
lazy = [0] * (4 * n)التطبيق على عقدة كاملة
عندما يغطي التحديث عقدة بالكامل، عدّل قيمتها المخزّنة وراكم التغيير في lazy، ثم توقّف. لا حاجة إلى النزول أكثر.
seg[node] += (r - l + 1) * val
lazy[node] += valادفع إلى الأسفل قبل النزول
قبل زيارة الأبناء، ادفع إلى الأسفل أي قيمة lazy معلّقة إلى كليهما. يحافظ ذلك على صحة الأبناء تمامًا عند قراءتهم.
def push_down(node, l, r):
if lazy[node]:
apply(2*node, l, mid)
apply(2*node+1, mid+1, r)
lazy[node] = 0ثلاث حالات لكل عقدة
يكون نطاق الاستعلام عند كل عقدة منفصلًا، أو يغطيها بالكامل، أو يغطيها جزئيًا. فتجاوز العقدة، أو طبّق التحديث بتأجيل، أو عاود النزول إلى النصفين على التوالي.
تبقى التحديثات المؤجلة لوغاريتمية
لا يلمس تحديث النطاق إلا O(log n) عقدة، لأن العقد المغطاة بالكامل تتوقف مبكرًا. وهذه هي الفائدة الأساسية من استخدام التأجيل. ⚡
الاستعلامات تمرّر التحديثات إلى الأسفل أيضًا
يجب أيضًا تمرير استعلامات النطاق إلى الأسفل قبل الاستدعاء التكراري، حتى تقرأ قيم الأبناء الأحدث. نسيان ذلك هو الخطأ الكلاسيكي في الانتشار الكسول.
رفع القيم بعد الاستدعاء التكراري
بعد تحديث الأبناء، أعد دمج قيمة العقدة الأب اعتمادًا عليهم. يحافظ هذا الرفع على اتساق كل عقدة داخلية مع شجرتها الفرعية.
seg[node] = seg[2*node] + seg[2*node+1]الإسناد مقابل الجمع
ينجح الانتشار الكسول مع العديد من العمليات، لكن الإسناد والجمع يندمجان بطريقة مختلفة. حدّد كيفية دمج تحديثين معلّقين قبل كتابة الكود.
متى يستحق الانتشار الكسول الاستخدام
استخدم الانتشار الكسول فقط عندما تحتاج فعلًا إلى تحديثات النطاق. أما لتحديثات النقاط وحدها، فشجرة المقاطع العادية أبسط وكافية.
تحقق سريع
ما الذي يجب أن يحدث قبل التكرار داخل أبناء العقدة؟
مراجعة: التحديثات المؤجلة
لقد تعلمت الانتشار الكسول: تخزين التغييرات المعلّقة، وتمريرها إلى الأسفل قبل النزول، ثم رفع القيم بعد ذلك، والحصول على تحديثات نطاق بتعقيد O(log n). 🎉
الأسئلة الشائعة
هل درس «الانتشار الكسول لتحديثات النطاق» مجاني؟
نعم — نص درس «الانتشار الكسول لتحديثات النطاق» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Coding Interview Prep، انتقل إلى CoddyKit PRO. تتضمن دورة Coding Interview Prep 4 دروس في المجموع.
ماذا ستتعلم في «الانتشار الكسول لتحديثات النطاق»؟
تأجيل التحديثات على نطاقات كاملة تتمرن على Coding Interview Prep مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Coding Interview Prep؟
لا تُشترط خبرة سابقة. Coding Interview Prep على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «الانتشار الكسول لتحديثات النطاق»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Coding Interview Prep هذا؟
نعم. كل درس في Coding Interview Prep يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- شجرة Fenwick للمجاميع السابقة
- الانقلابات باستخدام BIT
- شجرة المقاطع: الإنشاء والاستعلام
- الانتشار الكسول لتحديثات النطاق