شجرة الفترات

في علم الحاسوب ، تُعدّ شجرة الفترات بنية بيانات شجرية تُستخدم لتخزين الفترات . وبشكلٍ أدق، تُمكّن من إيجاد جميع الفترات التي تتداخل مع أي فترة أو نقطة مُعطاة بكفاءة. تُستخدم غالبًا في استعلامات النوافذ، [ 1 ] على سبيل المثال، لإيجاد جميع الطرق على خريطة حاسوبية داخل نافذة عرض مستطيلة، أو لإيجاد جميع العناصر المرئية داخل مشهد ثلاثي الأبعاد. وتُعدّ شجرة القطاعات بنية بيانات مُشابهة .

الحل البسيط هو زيارة كل فترة واختبار ما إذا كانت تتقاطع مع النقطة أو الفترة المعطاة، وهو ما يتطلبيا(ن){\displaystyle O(n)}الوقت، أينن{\displaystyle n}يمثل عدد الفترات في المجموعة. بما أن الاستعلام قد يُرجع جميع الفترات، على سبيل المثال إذا كان الاستعلام عبارة عن فترة كبيرة تتقاطع مع جميع الفترات في المجموعة، فإن هذا يُعدّ الأمثل تقاربياً ؛ ومع ذلك، فإن الخوارزميات الحساسة للمخرجات ، حيث يُعبّر عن وقت التشغيل بدلالةم{\displaystyle m}يمكن أيضًا مراعاة عدد الفترات التي ينتجها الاستعلام. تستغرق أشجار الفترات وقتًا للاستعلام قدرهيا(سجلن+م){\displaystyle O(\log n+m)}ووقت إنشاء أولي قدرهيا(نسجلن){\displaystyle O(n\log n)}مع الحد من استهلاك الذاكرة إلىيا(ن){\displaystyle O(n)}بعد إنشائها، قد تكون أشجار الفترات ديناميكية، مما يسمح بإدخال وحذف الفترات بكفاءة.يا(سجلن){\displaystyle O(\log n)}الوقت. إذا كانت نقاط نهاية الفترات الزمنية تقع ضمن نطاق عدد صحيح صغير ( على سبيل المثال ، في النطاق[1،...،يا(ن)]{\displaystyle [1,\ldots ,O(n)]}توجد هياكل بيانات أسرع، بل ومثالية، [ 2 ] [ 3 ] مع وقت معالجة مسبقةيا(ن){\displaystyle O(n)}ووقت الاستعلاميا(1+م){\displaystyle O(1+m)}للإبلاغم{\displaystyle m}الفترات التي تحتوي على نقطة استعلام معينة (انظر [ 2 ] للحصول على مثال بسيط للغاية).

نهج ساذج

في حالة بسيطة، لا تتداخل الفترات ويمكن إدراجها في شجرة بحث ثنائية بسيطة والاستعلام عنها فييا(سجلن){\displaystyle O(\log n)}مع مرور الوقت، ومع ذلك، في حالة وجود فترات زمنية متداخلة بشكل عشوائي، لا توجد طريقة لمقارنة فترتين لإدراجهما في الشجرة، لأن الترتيبات المصنفة حسب نقاط البداية أو نقاط النهاية قد تختلف. قد يكون أحد الأساليب البسيطة هو بناء شجرتين متوازيتين، إحداهما مرتبة حسب نقطة البداية، والأخرى مرتبة حسب نقطة النهاية لكل فترة زمنية. يسمح هذا باستبعاد نصف كل شجرة فييا(سجلن){\displaystyle O(\log n)}الوقت، ولكن يجب دمج النتائج، مما يتطلبيا(ن){\displaystyle O(n)}الوقت. هذا يُعيد الاستعلامات فييا(ن+سجلن)=يا(ن){\displaystyle O(n+\log n)=O(n)}وهو ليس أفضل من استخدام القوة الغاشمة.

تُحل هذه المشكلة باستخدام أشجار الفترات. تشرح هذه المقالة تصميمين بديلين لشجرة الفترات، يُطلق عليهما شجرة الفترات المركزية والشجرة المُعززة .

شجرة الفترات المركزية

تتطلب الاستفساراتيا(سجلن+م){\displaystyle O(\log n+m)}مع مرور الوقتن{\displaystyle n}وهو العدد الإجمالي للفترات وم{\displaystyle m}يمثل عدد النتائج المبلغ عنها. يتطلب البناءيا(نسجلن){\displaystyle O(n\log n)}يتطلب الأمر وقتًا وتخزينًايا(ن){\displaystyle O(n)}فضاء.

بناء

بالنظر إلى مجموعة منن{\displaystyle n}بالنسبة للفترات على خط الأعداد، يلزم إنشاء بنية بيانات بحيث يمكن استرجاع جميع الفترات المتداخلة مع فترة أو نقطة أخرى بكفاءة.

أولاً، يتم أخذ النطاق الكامل لجميع الفترات وتقسيمه إلى نصفين عندxمركز{\displaystyle x_{\textrm {center}}}(في الواقع العملي، xمركز{\displaystyle x_{\textrm {center}}}ينبغي اختيارها للحفاظ على توازن الشجرة نسبيًا). وهذا يعطي ثلاث مجموعات من الفترات، تلك الموجودة تمامًا على يسار xمركز{\displaystyle x_{\textrm {center}}}، مُسَمًّىSغادر{\displaystyle S_{\textrm {left}}}أولئك الذين يقعون تمامًا على يمينxمركز{\displaystyle x_{\textrm {center}}}، مُسَمًّى Sيمين{\displaystyle S_{\textrm {right}}}وتلك المتداخلةxمركز{\displaystyle x_{\textrm {center}}}، مُسَمًّىSمركز{\displaystyle S_{\textrm {center}}}.

الفترات في Sغادر{\displaystyle S_{\textrm {left}}}و Sيمين{\displaystyle S_{\textrm {right}}}يتم تقسيمها بشكل متكرر بنفس الطريقة حتى لا يتبقى أي فترات.

الفترات فيSمركز{\displaystyle S_{\textrm {center}}}تُخزَّن الفترات التي تتداخل مع نقطة المركز في بنية بيانات منفصلة مرتبطة بالعقدة في شجرة الفترات. تتكون بنية البيانات هذه من قائمتين، إحداهما تحتوي على جميع الفترات مرتبة حسب نقاط بدايتها، والأخرى تحتوي على جميع الفترات مرتبة حسب نقاط نهايتها.

والنتيجة هي شجرة ثنائية تحتوي كل عقدة فيها على ما يلي:

  • نقطة مركزية
  • مؤشر إلى عقدة أخرى تحتوي على جميع الفترات الزمنية الواقعة بالكامل إلى يسار نقطة المركز
  • مؤشر إلى عقدة أخرى تحتوي على جميع الفترات الزمنية الواقعة بالكامل على يمين نقطة المركز
  • جميع الفترات المتداخلة مع النقطة المركزية مرتبة حسب نقطة بدايتها
  • جميع الفترات المتداخلة مع نقطة المنتصف مرتبة حسب نقطة نهايتها

متقاطع

تتيح أشجار الفترات حساب جميع النطاقات المتداخلة مع أي مدخلات بسرعة.

مع نقطة

المهمة هي إيجاد جميع الفترات في الشجرة التي تتداخل مع نقطة معينةx{\displaystyle x}يتم اجتياز الشجرة باستخدام خوارزمية تكرارية مماثلة لتلك المستخدمة في اجتياز شجرة ثنائية تقليدية، ولكن مع منطق إضافي لدعم البحث عن الفترات المتداخلة مع نقطة "المركز" عند كل عقدة.

لكل عقدة من عقد الشجرة،x{\displaystyle x}مقارنة بـ xمركز{\displaystyle x_{\textrm {center}}}، وهي نقطة المنتصف المستخدمة في إنشاء العقدة أعلاه. إذاx{\displaystyle x}أقل من xمركز{\displaystyle x_{\textrm {center}}}، وهي المجموعة الموجودة في أقصى اليسار من الفترات الزمنية، Sغادر{\displaystyle S_{\textrm {left}}}يُؤخذ في الاعتبار. إذاx{\displaystyle x}أكبر من xمركز{\displaystyle x_{\textrm {center}}}، وهي المجموعة اليمنى من الفترات الزمنية، Sيمين{\displaystyle S_{\textrm {right}}}، يتم أخذه في الاعتبار.

جميع الفترات في Sمركز{\displaystyle S_{\textrm {center}}}التي تبدأ قبلx{\displaystyle x}يجب أن تتداخلx{\displaystyle x}لوx{\displaystyle x}أقل من xمركز{\displaystyle x_{\textrm {center}}}وبالمثل ، تنطبق نفس التقنية أيضًا في التحقق من فترة معينة. إذا انتهت فترة معينة عند y وكانت y أقل من xمركز{\displaystyle x_{\textrm {center}}}جميع الفترات في Sمركز{\displaystyle S_{\textrm {center}}}يجب أن تتداخل الأحداث التي تبدأ قبل y أيضًا مع الفترة الزمنية المعطاة.

أثناء معالجة كل عقدة أثناء اجتياز الشجرة من الجذر إلى ورقة، فإن النطاقات في Sمركز{\displaystyle S_{\textrm {center}}}تتم معالجتها. إذاx{\displaystyle x}أقل من xمركز{\displaystyle x_{\textrm {center}}}جميع الفترات في Sمركز{\displaystyle S_{\textrm {center}}}يجب إنهاء الإجازةx{\displaystyle x}أو أنها لا يمكن أن تتداخل أيضًا xمركز{\displaystyle x_{\textrm {center}}}لذلك، يكفي فقط إيجاد تلك الفترات فيSمركز{\displaystyle S_{\textrm {center}}}التي تبدأ قبلx{\displaystyle x}قوائمSمركز{\displaystyle S_{\textrm {center}}}يمكن الرجوع إلى القوائم التي تم إنشاؤها مسبقًا. وبما أن بدايات الفترات فقط هي المهمة في هذا السيناريو، فيمكن فرز القائمة حسب البدايات. إذا كان أقرب رقم لا يزيد عنx{\displaystyle x}إذا وُجدت في هذه القائمة، فإن جميع النطاقات من بداية القائمة إلى تلك النقطة التي تم العثور عليها تتداخلx{\displaystyle x}لأنها تبدأ قبلx{\displaystyle x}وينتهيx{\displaystyle x}(لأنها تتداخل)xمركز{\displaystyle x_{\textrm {center}}}وهو أكبر منx{\displaystyle x}وبالتالي، يمكن تعداد الفترات في القائمة حتى تتجاوز قيمة نقطة البدايةx{\displaystyle x}.

وبالمثل، إذاx{\displaystyle x}أكبر من xمركز{\displaystyle x_{\textrm {center}}}جميع الفترات في Sمركز{\displaystyle S_{\textrm {center}}}يجب أن يبدأ قبلx{\displaystyle x}لذا فإن الفترات التي تنتهي بعدx{\displaystyle x}يمكن العثور عليها باستخدام القائمة المصنفة حسب نهايات الفترات.

لوx{\displaystyle x}يتطابق تمامًاxمركز{\displaystyle x_{\textrm {center}}}جميع الفترات فيSمركز{\displaystyle S_{\textrm {center}}}يمكن إضافتها إلى النتائج دون مزيد من المعالجة ويمكن إيقاف عملية اجتياز الشجرة.

بفاصل زمني

لفترة النتائجر{\displaystyle r}لتقاطع فاصل الاستعلامq{\displaystyle q}يجب أن يتحقق أحد الشروط التالية:

  • إما نقطة البداية أو نقطة النهاية لـر{\displaystyle r}هو فيq{\displaystyle q}؛ أو
  • ر{\displaystyle r}يحيط بالكاملq{\displaystyle q}.

نجد أولاً جميع الفترات التي تحتوي على نقاط بداية و/أو نهاية داخلهاq{\displaystyle q}باستخدام شجرة مُنشأة بشكل منفصل. في الحالة أحادية البُعد، يُمكننا استخدام شجرة بحث تحتوي على جميع نقاط البداية والنهاية في مجموعة الفترات، مع مؤشر لكل نقطة إلى الفترة المقابلة لها. البحث الثنائي فييا(سجلن){\displaystyle O(\log n)}وقت بداية ونهايةq{\displaystyle q}يكشف هذا عن الحد الأدنى والحد الأقصى للنقاط التي يجب مراعاتها. تشير كل نقطة ضمن هذا النطاق إلى فترة زمنية متداخلة.q{\displaystyle q}ويُضاف إلى قائمة النتائج. يجب توخي الحذر لتجنب التكرارات، حيث قد تبدأ الفترة وتنتهي ضمنها.q{\displaystyle q}يمكن القيام بذلك باستخدام علامة ثنائية على كل فاصل زمني لتحديد ما إذا تمت إضافته إلى مجموعة النتائج أم لا.

وأخيرًا، يجب علينا إيجاد فترات تُحيط بـq{\displaystyle q}لإيجاد هذه النقاط، نختار أي نقطة داخلها.q{\displaystyle q}واستخدم الخوارزمية المذكورة أعلاه للعثور على جميع الفترات التي تتقاطع مع تلك النقطة (مع الحرص مرة أخرى على إزالة التكرارات).

أبعاد أعلى

يمكن تعميم بنية بيانات شجرة الفترات إلى بُعد أعلىشمال{\displaystyle N}مع نفس وقت الاستعلام والإنشاء ويا(نسجلن){\displaystyle O(n\log n)}فضاء.

أولاً، شجرة نطاق فيشمال{\displaystyle N}تم إنشاء أبعاد تسمح باسترجاع فعال لجميع الفترات ذات نقاط البداية والنهاية داخل منطقة الاستعلامR{\displaystyle R}بمجرد العثور على النطاقات المتناظرة، لا يتبقى سوى النطاقات التي تُحيط بالمنطقة في بُعدٍ ما. ولإيجاد هذه التداخلات، شمال{\displaystyle N}يتم إنشاء أشجار الفترات، ويتقاطع محور واحدR{\displaystyle R}يتم الاستعلام عن كل منها. على سبيل المثال، في بعدين، الجزء السفلي من المربع R{\displaystyle R}(أو أي خط أفقي آخر يتقاطع)R{\displaystyle R}سيتم الاستعلام عن ) مقابل شجرة الفترات التي تم إنشاؤها للمحور الأفقي. وبالمثل، اليسار (أو أي خط رأسي آخر يتقاطعR{\displaystyle R}سيتم الاستعلام عن ) مقابل شجرة الفترات التي تم إنشاؤها على المحور الرأسي.

تحتاج كل شجرة فترات أيضًا إلى إضافة للأبعاد الأعلى. عند كل عقدة نجتازها في الشجرة،x{\displaystyle x}تتم مقارنته بـ Sمركز{\displaystyle S_{\textrm {center}}}لإيجاد نقاط التداخل. بدلاً من قائمتين مرتبتين من النقاط كما هو مستخدم في الحالة أحادية البعد، يتم إنشاء شجرة نطاق. وهذا يسمح باسترجاع جميع النقاط بكفاءة في Sمركز{\displaystyle S_{\textrm {center}}}تلك المنطقة المتداخلةR{\displaystyle R}.

الحذف

إذا لم تحتوي العقدة التي تحتوي على فترة زمنية معينة من الشجرة، بعد حذفها، على أي فترات زمنية أخرى، فيمكن حذف تلك العقدة من الشجرة. هذه العملية أكثر تعقيدًا من عملية حذف عادية في شجرة ثنائية.

قد تتداخل فترة زمنية مع مركز عدة عقد في الشجرة. وبما أن كل عقدة تخزن الفترات الزمنية المتداخلة معها، مع وجود جميع الفترات الزمنية بالكامل إلى يسار مركزها في الشجرة الفرعية اليسرى، وبالمثل بالنسبة للشجرة الفرعية اليمنى، فإنه يترتب على ذلك أن كل فترة زمنية تُخزن في العقدة الأقرب إلى الجذر من مجموعة العقد التي تتداخل مع مركزها.

تتضمن عمليات الحذف العادية في الشجرة الثنائية (في حالة وجود طفلين للعقدة المراد حذفها) ترقية عقدة أبعد من الورقة إلى موضع العقدة المراد حذفها (عادةً ما يكون الطفل الأيسر للشجرة الفرعية اليمنى، أو الطفل الأيمن للشجرة الفرعية اليسرى).

حذف عقدة تحتوي على طفلين من شجرة بحث ثنائية باستخدام السلف المرتب (العقدة الموجودة في أقصى اليمين في الشجرة الفرعية اليسرى، والمُصنفة برقم 6 ).

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

الموازنة

إن نفس المشكلات التي تؤثر على الحذف تؤثر أيضًا على عمليات التدوير؛ يجب أن يحافظ التدوير على الثابت المتمثل في تخزين العقد بالقرب من الجذر قدر الإمكان.

شجرة مُعززة

شجرة مُعززة بقيمة منخفضة كمفتاح وقيمة قصوى عالية كتعليق إضافي.
على سبيل المثال، عند اختبار ما إذا كانت الفترة [40، 60) تتداخل مع الفترات في الشجرة الموضحة أعلاه، نلاحظ أنها لا تتداخل مع الفترة [20، 36) في الجذر، ولكن بما أن القيمة الدنيا للجذر (20) أقل من القيمة العليا المطلوبة (60)، يجب علينا البحث في الشجرة الفرعية اليمنى. تتجاوز القيمة العليا القصوى للشجرة الفرعية اليسرى (41) القيمة الدنيا المطلوبة (40)، لذا يجب علينا البحث في الشجرة الفرعية اليسرى أيضًا. مع ذلك، فإن القيم العليا القصوى لكلا الفرعين المتفرعين من العقدة [3، 41) أقل من 40، لذا ينتهي البحث في الشجرة الفرعية اليسرى عند هذا الحد، ولا داعي للبحث فيهما.

تم وصف طريقة أخرى لتمثيل الفترات في كورمن وآخرون (2009 ، القسم 14.3: أشجار الفترات، الصفحات 348-354 ) . 

يتطلب كل من الإدخال والحذفيا(سجلن){\displaystyle O(\log n)}مع مرور الوقتن{\displaystyle n}يمثل العدد الإجمالي للفترات في الشجرة قبل عملية الإضافة أو الحذف.

يمكن بناء شجرة مُعززة من شجرة مُرتبة بسيطة، مثل شجرة البحث الثنائية أو شجرة البحث الثنائية ذاتية التوازن ، مُرتبة حسب القيم الدنيا للفترات. تُضاف بعد ذلك علامة إضافية إلى كل عقدة، تُسجل أعلى قيمة بين جميع الفترات من هذه العقدة نزولًا. يتطلب الحفاظ على هذه السمة تحديث جميع أسلاف العقدة من الأسفل إلى الأعلى عند إضافة أو حذف أي عقدة. يستغرق هذا O( h ) خطوة فقط لكل عملية إضافة أو حذف، حيث h هو ارتفاع العقدة المُضافة أو المحذوفة في الشجرة. في حال حدوث أي دوران للشجرة أثناء الإضافة والحذف، قد تحتاج العقد المتأثرة إلى التحديث أيضًا.

من المعروف الآن أن هناك فترتينأ{\displaystyle A}وب{\displaystyle B}لا يحدث التداخل إلا عندما يكون كلاهماأقليلبعالي{\displaystyle A_{\textrm {low}}\leq B_{\textrm {high}}}وأعاليبقليل{\displaystyle A_{\textrm {high}}\geq B_{\textrm {low}}}عند البحث في الأشجار عن العقد المتداخلة مع فترة زمنية معينة، يمكنك تخطي ما يلي مباشرة:

  • جميع العقد الموجودة على يمين العقد التي تتجاوز قيمتها الدنيا نهاية الفترة الزمنية المحددة.
  • جميع العقد التي تقل قيمتها القصوى عن بداية الفترة المحددة.

استفسارات العضوية

قد يتحسن الأداء قليلاً إذا تجنبت الشجرة عمليات الاجتياز غير الضرورية. قد تحدث هذه العمليات عند إضافة فترات موجودة مسبقاً أو إزالة فترات غير موجودة.

يمكن تعريف ترتيب كلي على الفترات بترتيبها أولاً حسب حدودها الدنيا ثم حسب حدودها العليا. بعد ذلك، يمكن إجراء فحص الانتماء فييا(سجلن){\displaystyle O(\log n)}الوقت، مقابليا(ك+سجلن){\displaystyle O(k+\log n)}الوقت اللازم للعثور على التكرارات إذاك{\displaystyle k}تتداخل الفترات مع الفترة المراد إدراجها أو إزالتها. يتميز هذا الحل بعدم الحاجة إلى أي هياكل إضافية، فالتغيير خوارزمي بحت. أما عيبه فهو أن استعلامات العضوية تستغرق وقتًا أطول.يا(سجلن){\displaystyle O(\log n)}وقت.

أو بدلاً من ذلك، بمعدليا(ن){\displaystyle O(n)}يمكن تنفيذ استعلامات العضوية المتعلقة بالذاكرة في وقت ثابت متوقع باستخدام جدول تجزئة، يتم تحديثه بالتزامن مع شجرة الفترات. قد لا يؤدي هذا بالضرورة إلى مضاعفة إجمالي متطلبات الذاكرة، إذا تم تخزين الفترات بالمرجع بدلاً من القيمة.

مثال بلغة جافا: إضافة فاصل زمني جديد إلى الشجرة

مفتاح كل عقدة هو الفترة نفسها، وبالتالي يتم ترتيب العقد أولاً حسب القيمة المنخفضة وأخيراً حسب القيمة العالية، وقيمة كل عقدة هي نقطة نهاية الفترة:

public void add ( Interval i ) { put ( i , i . getEnd ()); }

مثال بلغة جافا: البحث عن نقطة أو فاصل زمني في الشجرة

للبحث عن فاصل زمني، يتم استعراض الشجرة باستخدام المفتاح ( n.getKey()) والقيمة العالية ( n.getValue()) لاستبعاد أي فروع لا يمكن أن تتداخل مع الاستعلام. أبسط حالة هي استعلام النقطة:

// ابحث عن جميع الفترات التي تحتوي على "p"، بدءًا من // العقدة "n" وإضافة الفترات المطابقة إلى القائمة "result" public void search ( IntervalNode n , Point p , List < Interval > result ) { // لا تبحث في العقد غير الموجودة if ( n == null ) return ;// إذا كانت p على يمين أقصى نقطة يمين أي فاصل زمني // في هذه العقدة وجميع أبنائها، فلن يكون هناك أي تطابق. إذا ( p . compareTo ( n . getValue ()) > 0 ) return ;// البحث عن الأبناء اليساريين search ( n . getLeft (), p , result );// تحقق من هذه العقدة إذا ( n . getKey (). contains ( p )) result . add ( n . getKey ());// إذا كان p على يسار بداية هذه الفترة، // فلا يمكن أن يكون في أي عنصر فرعي على اليمين. إذا ( p . compareTo ( n . getKey (). getStart ()) < 0 ) return ;// وإلا، ابحث عن الأبناء الأيمنين باستخدام search ( n.getRight ( ), p , result ); }

أين

a.compareTo(b)تُرجع قيمة سالبة إذا كانت قيمة a < b
a.compareTo(b)تُرجع القيمة صفر إذا كانت a = b
a.compareTo(b)تُرجع قيمة موجبة إذا كانت a > b

الكود المستخدم للبحث عن فترة زمنية مشابه، باستثناء الفحص الموجود في المنتصف:

// تحقق من هذه العقدة إذا ( n . getKey (). overlapsWith ( i )) result . add ( n . getKey ());

overlapsWith()يُعرَّف على النحو التالي:

public boolean overlapsWith ( Interval other ) { return start . compareTo ( other . getEnd ()) <= 0 && end . compareTo ( other . getStart ()) >= 0 ; }

أبعاد أعلى

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

الحل الأبسط هو استخدام أشجار الفترات المتداخلة. أولًا، أنشئ شجرة باستخدام نطاقات الإحداثي y . ثم، لكل عقدة في الشجرة، أضف شجرة فترات أخرى على نطاقات x ، لجميع العناصر التي يكون نطاق y الخاص بها هو نفسه نطاق y الخاص بتلك العقدة .

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

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

شجرة موجهة نحو الوسط أو الطول

الشجرة الموجهة نحو الوسط أو الطول تشبه الشجرة الموسعة، لكنها متناظرة، حيث تُرتَّب شجرة البحث الثنائية وفقًا للنقاط الوسطى للفترات. يوجد في كل عقدة كومة ثنائية موجهة نحو القيمة القصوى ، مرتبة حسب طول الفترة (أو نصف طولها). كما نخزن في كل عقدة أصغر وأكبر قيمة ممكنة للشجرة الفرعية (وهذا ما يُفسر التناظر).

اختبار التداخل

باستخدام قيمتي البداية والنهاية فقط لفترتين(أأنا،بأنا){\displaystyle \left(a_{i},b_{i}\right)}، لأنا=0،1{\displaystyle i=0,1}يمكن إجراء اختبار التداخل على النحو التالي:

أ0<ب1{\displaystyle a_{0}<b_{1}}وأ1<ب0{\displaystyle a_{1}<b_{0}}

يمكن تبسيط ذلك باستخدام المجموع والفرق:

sأنا=أأنا+بأنا{\displaystyle s_{i}=a_{i}+b_{i}}

دأنا=بأنا-أأنا{\displaystyle d_{i}=b_{i}-a_{i}}

مما يقلل اختبار التداخل إلى:

|s1-s0|<د0+د1{\displaystyle \left|s_{1}-s_{0}\right|<d_{0}+d_{1}}

إضافة فاصل زمني

إضافة فترات جديدة إلى الشجرة هي نفسها في شجرة البحث الثنائية باستخدام القيمة الوسطى كمفتاح. نقوم بدفعها.دأنا{\displaystyle d_{i}}على الكومة الثنائية المرتبطة بالعقدة، وتحديث القيم الدنيا والقصوى الممكنة المرتبطة بجميع العقد الأعلى.

البحث عن جميع الفترات المتداخلة

لنستخدمأq،بq،مq،دq{\displaystyle a_{q},b_{q},m_{q},d_{q}}بالنسبة لفترة الاستعلام، ومن{\displaystyle M_{n}}بالنسبة لمفتاح العقدة (مقارنة بـمأنا{\displaystyle m_{i}}(من الفترات)

بدءًا من العقدة الجذرية، في كل عقدة، نتحقق أولاً مما إذا كان من الممكن أن تتداخل فترة الاستعلام الخاصة بنا مع الشجرة الفرعية للعقدة باستخدام القيم الدنيا والقصوى للعقدة (إذا لم يكن الأمر كذلك، فإننا لا نستمر لهذه العقدة).

ثم نقوم بالحسابمين{دأنا}{\displaystyle \min \left\{d_{i}\right\}}لكي تتداخل الفترات الزمنية داخل هذه العقدة (وليس أبنائها) مع فترة الاستعلام (مع العلم بذلك).مأنا=من{\displaystyle m_{i}=M_{n}}):

مين{دأنا}=|مq-من|-دq{\displaystyle \min \left\{d_{i}\right\}=\left|m_{q}-M_{n}\right|-d_{q}}

ثم قم بإجراء استعلام على كومة الملفات الثنائية الخاصة بها لـدأنا{\displaystyle d_{i}}أكبر منمين{دأنا}{\displaystyle \min \left\{d_{i}\right\}}

ثم نمر عبر كل من الأبناء الأيسر والأيمن للعقدة، ونفعل الشيء نفسه.

في أسوأ الأحوال، يتعين علينا فحص جميع عقد شجرة البحث الثنائية، ولكن بما أن استعلام الكومة الثنائية هو الأمثل، فهذا مقبول (لا يمكن أن تكون المشكلة ثنائية الأبعاد مثالية في كلا البعدين).

من المتوقع أن تكون هذه الخوارزمية أسرع من شجرة الفترات التقليدية (الشجرة المعززة) في عمليات البحث. إضافة العناصر أبطأ قليلاً عملياً، مع أن ترتيب النمو يبقى نفسه.

مراجع

  1. "الهندسة الحسابية - استعلامات النوافذ" (ملف PDF) . مؤرشف من النسخة الأصلية (ملف PDF) بتاريخ 24-10-2022.
  2. 1 2 ينس م. شميدت . مسائل تحديد الفترات في نطاقات الأعداد الصحيحة الصغيرة . DOI . ISAAC'09، 2009
  3. استعلام النطاق (علوم الحاسوب)# عوامل شبه المجموعة