شجرة الفترات
في علم الحاسوب ، تُعدّ شجرة الفترات بنية بيانات شجرية تُستخدم لتخزين الفترات . وبشكلٍ أدق، تُمكّن من إيجاد جميع الفترات التي تتداخل مع أي فترة أو نقطة مُعطاة بكفاءة. تُستخدم غالبًا في استعلامات النوافذ، [ 1 ] على سبيل المثال، لإيجاد جميع الطرق على خريطة حاسوبية داخل نافذة عرض مستطيلة، أو لإيجاد جميع العناصر المرئية داخل مشهد ثلاثي الأبعاد. وتُعدّ شجرة القطاعات بنية بيانات مُشابهة .
الحل البسيط هو زيارة كل فترة واختبار ما إذا كانت تتقاطع مع النقطة أو الفترة المعطاة، وهو ما يتطلبالوقت، أينيمثل عدد الفترات في المجموعة. بما أن الاستعلام قد يُرجع جميع الفترات، على سبيل المثال إذا كان الاستعلام عبارة عن فترة كبيرة تتقاطع مع جميع الفترات في المجموعة، فإن هذا يُعدّ الأمثل تقاربياً ؛ ومع ذلك، فإن الخوارزميات الحساسة للمخرجات ، حيث يُعبّر عن وقت التشغيل بدلالةيمكن أيضًا مراعاة عدد الفترات التي ينتجها الاستعلام. تستغرق أشجار الفترات وقتًا للاستعلام قدرهووقت إنشاء أولي قدرهمع الحد من استهلاك الذاكرة إلىبعد إنشائها، قد تكون أشجار الفترات ديناميكية، مما يسمح بإدخال وحذف الفترات بكفاءة.الوقت. إذا كانت نقاط نهاية الفترات الزمنية تقع ضمن نطاق عدد صحيح صغير ( على سبيل المثال ، في النطاقتوجد هياكل بيانات أسرع، بل ومثالية، [ 2 ] [ 3 ] مع وقت معالجة مسبقةووقت الاستعلامللإبلاغالفترات التي تحتوي على نقطة استعلام معينة (انظر [ 2 ] للحصول على مثال بسيط للغاية).
نهج ساذج
في حالة بسيطة، لا تتداخل الفترات ويمكن إدراجها في شجرة بحث ثنائية بسيطة والاستعلام عنها فيمع مرور الوقت، ومع ذلك، في حالة وجود فترات زمنية متداخلة بشكل عشوائي، لا توجد طريقة لمقارنة فترتين لإدراجهما في الشجرة، لأن الترتيبات المصنفة حسب نقاط البداية أو نقاط النهاية قد تختلف. قد يكون أحد الأساليب البسيطة هو بناء شجرتين متوازيتين، إحداهما مرتبة حسب نقطة البداية، والأخرى مرتبة حسب نقطة النهاية لكل فترة زمنية. يسمح هذا باستبعاد نصف كل شجرة فيالوقت، ولكن يجب دمج النتائج، مما يتطلبالوقت. هذا يُعيد الاستعلامات فيوهو ليس أفضل من استخدام القوة الغاشمة.
تُحل هذه المشكلة باستخدام أشجار الفترات. تشرح هذه المقالة تصميمين بديلين لشجرة الفترات، يُطلق عليهما شجرة الفترات المركزية والشجرة المُعززة .
شجرة الفترات المركزية
تتطلب الاستفساراتمع مرور الوقتوهو العدد الإجمالي للفترات ويمثل عدد النتائج المبلغ عنها. يتطلب البناءيتطلب الأمر وقتًا وتخزينًافضاء.
بناء
بالنظر إلى مجموعة منبالنسبة للفترات على خط الأعداد، يلزم إنشاء بنية بيانات بحيث يمكن استرجاع جميع الفترات المتداخلة مع فترة أو نقطة أخرى بكفاءة.
أولاً، يتم أخذ النطاق الكامل لجميع الفترات وتقسيمه إلى نصفين عند(في الواقع العملي، ينبغي اختيارها للحفاظ على توازن الشجرة نسبيًا). وهذا يعطي ثلاث مجموعات من الفترات، تلك الموجودة تمامًا على يسار ، مُسَمًّىأولئك الذين يقعون تمامًا على يمين، مُسَمًّى وتلك المتداخلة، مُسَمًّى.
الفترات في و يتم تقسيمها بشكل متكرر بنفس الطريقة حتى لا يتبقى أي فترات.
الفترات فيتُخزَّن الفترات التي تتداخل مع نقطة المركز في بنية بيانات منفصلة مرتبطة بالعقدة في شجرة الفترات. تتكون بنية البيانات هذه من قائمتين، إحداهما تحتوي على جميع الفترات مرتبة حسب نقاط بدايتها، والأخرى تحتوي على جميع الفترات مرتبة حسب نقاط نهايتها.
والنتيجة هي شجرة ثنائية تحتوي كل عقدة فيها على ما يلي:
- نقطة مركزية
- مؤشر إلى عقدة أخرى تحتوي على جميع الفترات الزمنية الواقعة بالكامل إلى يسار نقطة المركز
- مؤشر إلى عقدة أخرى تحتوي على جميع الفترات الزمنية الواقعة بالكامل على يمين نقطة المركز
- جميع الفترات المتداخلة مع النقطة المركزية مرتبة حسب نقطة بدايتها
- جميع الفترات المتداخلة مع نقطة المنتصف مرتبة حسب نقطة نهايتها
متقاطع
تتيح أشجار الفترات حساب جميع النطاقات المتداخلة مع أي مدخلات بسرعة.
مع نقطة
المهمة هي إيجاد جميع الفترات في الشجرة التي تتداخل مع نقطة معينةيتم اجتياز الشجرة باستخدام خوارزمية تكرارية مماثلة لتلك المستخدمة في اجتياز شجرة ثنائية تقليدية، ولكن مع منطق إضافي لدعم البحث عن الفترات المتداخلة مع نقطة "المركز" عند كل عقدة.
لكل عقدة من عقد الشجرة،مقارنة بـ ، وهي نقطة المنتصف المستخدمة في إنشاء العقدة أعلاه. إذاأقل من ، وهي المجموعة الموجودة في أقصى اليسار من الفترات الزمنية، يُؤخذ في الاعتبار. إذاأكبر من ، وهي المجموعة اليمنى من الفترات الزمنية، ، يتم أخذه في الاعتبار.

أثناء معالجة كل عقدة أثناء اجتياز الشجرة من الجذر إلى ورقة، فإن النطاقات في تتم معالجتها. إذاأقل من جميع الفترات في يجب إنهاء الإجازةأو أنها لا يمكن أن تتداخل أيضًا لذلك، يكفي فقط إيجاد تلك الفترات فيالتي تبدأ قبلقوائميمكن الرجوع إلى القوائم التي تم إنشاؤها مسبقًا. وبما أن بدايات الفترات فقط هي المهمة في هذا السيناريو، فيمكن فرز القائمة حسب البدايات. إذا كان أقرب رقم لا يزيد عنإذا وُجدت في هذه القائمة، فإن جميع النطاقات من بداية القائمة إلى تلك النقطة التي تم العثور عليها تتداخللأنها تبدأ قبلوينتهي(لأنها تتداخل)وهو أكبر منوبالتالي، يمكن تعداد الفترات في القائمة حتى تتجاوز قيمة نقطة البداية.
وبالمثل، إذاأكبر من جميع الفترات في يجب أن يبدأ قبللذا فإن الفترات التي تنتهي بعديمكن العثور عليها باستخدام القائمة المصنفة حسب نهايات الفترات.
لويتطابق تمامًاجميع الفترات فييمكن إضافتها إلى النتائج دون مزيد من المعالجة ويمكن إيقاف عملية اجتياز الشجرة.
بفاصل زمني
لفترة النتائجلتقاطع فاصل الاستعلاميجب أن يتحقق أحد الشروط التالية:
- إما نقطة البداية أو نقطة النهاية لـهو في؛ أو
- يحيط بالكامل.
نجد أولاً جميع الفترات التي تحتوي على نقاط بداية و/أو نهاية داخلهاباستخدام شجرة مُنشأة بشكل منفصل. في الحالة أحادية البُعد، يُمكننا استخدام شجرة بحث تحتوي على جميع نقاط البداية والنهاية في مجموعة الفترات، مع مؤشر لكل نقطة إلى الفترة المقابلة لها. البحث الثنائي فيوقت بداية ونهايةيكشف هذا عن الحد الأدنى والحد الأقصى للنقاط التي يجب مراعاتها. تشير كل نقطة ضمن هذا النطاق إلى فترة زمنية متداخلة.ويُضاف إلى قائمة النتائج. يجب توخي الحذر لتجنب التكرارات، حيث قد تبدأ الفترة وتنتهي ضمنها.يمكن القيام بذلك باستخدام علامة ثنائية على كل فاصل زمني لتحديد ما إذا تمت إضافته إلى مجموعة النتائج أم لا.
وأخيرًا، يجب علينا إيجاد فترات تُحيط بـلإيجاد هذه النقاط، نختار أي نقطة داخلها.واستخدم الخوارزمية المذكورة أعلاه للعثور على جميع الفترات التي تتقاطع مع تلك النقطة (مع الحرص مرة أخرى على إزالة التكرارات).
أبعاد أعلى
يمكن تعميم بنية بيانات شجرة الفترات إلى بُعد أعلىمع نفس وقت الاستعلام والإنشاء وفضاء.
أولاً، شجرة نطاق فيتم إنشاء أبعاد تسمح باسترجاع فعال لجميع الفترات ذات نقاط البداية والنهاية داخل منطقة الاستعلامبمجرد العثور على النطاقات المتناظرة، لا يتبقى سوى النطاقات التي تُحيط بالمنطقة في بُعدٍ ما. ولإيجاد هذه التداخلات، يتم إنشاء أشجار الفترات، ويتقاطع محور واحديتم الاستعلام عن كل منها. على سبيل المثال، في بعدين، الجزء السفلي من المربع (أو أي خط أفقي آخر يتقاطع)سيتم الاستعلام عن ) مقابل شجرة الفترات التي تم إنشاؤها للمحور الأفقي. وبالمثل، اليسار (أو أي خط رأسي آخر يتقاطعسيتم الاستعلام عن ) مقابل شجرة الفترات التي تم إنشاؤها على المحور الرأسي.
تحتاج كل شجرة فترات أيضًا إلى إضافة للأبعاد الأعلى. عند كل عقدة نجتازها في الشجرة،تتم مقارنته بـ لإيجاد نقاط التداخل. بدلاً من قائمتين مرتبتين من النقاط كما هو مستخدم في الحالة أحادية البعد، يتم إنشاء شجرة نطاق. وهذا يسمح باسترجاع جميع النقاط بكفاءة في تلك المنطقة المتداخلة.
الحذف
إذا لم تحتوي العقدة التي تحتوي على فترة زمنية معينة من الشجرة، بعد حذفها، على أي فترات زمنية أخرى، فيمكن حذف تلك العقدة من الشجرة. هذه العملية أكثر تعقيدًا من عملية حذف عادية في شجرة ثنائية.
قد تتداخل فترة زمنية مع مركز عدة عقد في الشجرة. وبما أن كل عقدة تخزن الفترات الزمنية المتداخلة معها، مع وجود جميع الفترات الزمنية بالكامل إلى يسار مركزها في الشجرة الفرعية اليسرى، وبالمثل بالنسبة للشجرة الفرعية اليمنى، فإنه يترتب على ذلك أن كل فترة زمنية تُخزن في العقدة الأقرب إلى الجذر من مجموعة العقد التي تتداخل مع مركزها.
تتضمن عمليات الحذف العادية في الشجرة الثنائية (في حالة وجود طفلين للعقدة المراد حذفها) ترقية عقدة أبعد من الورقة إلى موضع العقدة المراد حذفها (عادةً ما يكون الطفل الأيسر للشجرة الفرعية اليمنى، أو الطفل الأيمن للشجرة الفرعية اليسرى).

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

تم وصف طريقة أخرى لتمثيل الفترات في كورمن وآخرون (2009 ، القسم 14.3: أشجار الفترات، الصفحات 348-354 ) .
يتطلب كل من الإدخال والحذفمع مرور الوقتيمثل العدد الإجمالي للفترات في الشجرة قبل عملية الإضافة أو الحذف.
يمكن بناء شجرة مُعززة من شجرة مُرتبة بسيطة، مثل شجرة البحث الثنائية أو شجرة البحث الثنائية ذاتية التوازن ، مُرتبة حسب القيم الدنيا للفترات. تُضاف بعد ذلك علامة إضافية إلى كل عقدة، تُسجل أعلى قيمة بين جميع الفترات من هذه العقدة نزولًا. يتطلب الحفاظ على هذه السمة تحديث جميع أسلاف العقدة من الأسفل إلى الأعلى عند إضافة أو حذف أي عقدة. يستغرق هذا O( h ) خطوة فقط لكل عملية إضافة أو حذف، حيث h هو ارتفاع العقدة المُضافة أو المحذوفة في الشجرة. في حال حدوث أي دوران للشجرة أثناء الإضافة والحذف، قد تحتاج العقد المتأثرة إلى التحديث أيضًا.
من المعروف الآن أن هناك فترتينولا يحدث التداخل إلا عندما يكون كلاهماوعند البحث في الأشجار عن العقد المتداخلة مع فترة زمنية معينة، يمكنك تخطي ما يلي مباشرة:
- جميع العقد الموجودة على يمين العقد التي تتجاوز قيمتها الدنيا نهاية الفترة الزمنية المحددة.
- جميع العقد التي تقل قيمتها القصوى عن بداية الفترة المحددة.
استفسارات العضوية
قد يتحسن الأداء قليلاً إذا تجنبت الشجرة عمليات الاجتياز غير الضرورية. قد تحدث هذه العمليات عند إضافة فترات موجودة مسبقاً أو إزالة فترات غير موجودة.
يمكن تعريف ترتيب كلي على الفترات بترتيبها أولاً حسب حدودها الدنيا ثم حسب حدودها العليا. بعد ذلك، يمكن إجراء فحص الانتماء فيالوقت، مقابلالوقت اللازم للعثور على التكرارات إذاتتداخل الفترات مع الفترة المراد إدراجها أو إزالتها. يتميز هذا الحل بعدم الحاجة إلى أي هياكل إضافية، فالتغيير خوارزمي بحت. أما عيبه فهو أن استعلامات العضوية تستغرق وقتًا أطول.وقت.
أو بدلاً من ذلك، بمعدليمكن تنفيذ استعلامات العضوية المتعلقة بالذاكرة في وقت ثابت متوقع باستخدام جدول تجزئة، يتم تحديثه بالتزامن مع شجرة الفترات. قد لا يؤدي هذا بالضرورة إلى مضاعفة إجمالي متطلبات الذاكرة، إذا تم تخزين الفترات بالمرجع بدلاً من القيمة.
مثال بلغة جافا: إضافة فاصل زمني جديد إلى الشجرة
مفتاح كل عقدة هو الفترة نفسها، وبالتالي يتم ترتيب العقد أولاً حسب القيمة المنخفضة وأخيراً حسب القيمة العالية، وقيمة كل عقدة هي نقطة نهاية الفترة:
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 < ba.compareTo(b)تُرجع القيمة صفر إذا كانت a = ba.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 الخاص بتلك العقدة .
تتمثل ميزة هذا الحل في أنه يمكن توسيعه ليشمل عددًا عشوائيًا من الأبعاد باستخدام نفس قاعدة التعليمات البرمجية.
قد تبدو التكلفة الإضافية للأشجار المتداخلة باهظة في البداية، لكنها عادةً ما تكون أقل من ذلك. وكما هو الحال مع الحل غير المتداخل السابق، يلزم عقدة واحدة لكل إحداثية س ، مما ينتج عنه نفس عدد العقد في كلا الحلين. والعبء الإضافي الوحيد هو عبء هياكل الأشجار المتداخلة، هيكل واحد لكل فاصل رأسي. عادةً ما يكون حجم هذا الهيكل ضئيلاً، إذ يتكون فقط من مؤشر إلى العقدة الجذرية، وربما عدد العقد وعمق الشجرة.
شجرة موجهة نحو الوسط أو الطول
الشجرة الموجهة نحو الوسط أو الطول تشبه الشجرة الموسعة، لكنها متناظرة، حيث تُرتَّب شجرة البحث الثنائية وفقًا للنقاط الوسطى للفترات. يوجد في كل عقدة كومة ثنائية موجهة نحو القيمة القصوى ، مرتبة حسب طول الفترة (أو نصف طولها). كما نخزن في كل عقدة أصغر وأكبر قيمة ممكنة للشجرة الفرعية (وهذا ما يُفسر التناظر).
اختبار التداخل
باستخدام قيمتي البداية والنهاية فقط لفترتين، ليمكن إجراء اختبار التداخل على النحو التالي:
و
يمكن تبسيط ذلك باستخدام المجموع والفرق:
مما يقلل اختبار التداخل إلى:
إضافة فاصل زمني
إضافة فترات جديدة إلى الشجرة هي نفسها في شجرة البحث الثنائية باستخدام القيمة الوسطى كمفتاح. نقوم بدفعها.على الكومة الثنائية المرتبطة بالعقدة، وتحديث القيم الدنيا والقصوى الممكنة المرتبطة بجميع العقد الأعلى.
البحث عن جميع الفترات المتداخلة
لنستخدمبالنسبة لفترة الاستعلام، وبالنسبة لمفتاح العقدة (مقارنة بـ(من الفترات)
بدءًا من العقدة الجذرية، في كل عقدة، نتحقق أولاً مما إذا كان من الممكن أن تتداخل فترة الاستعلام الخاصة بنا مع الشجرة الفرعية للعقدة باستخدام القيم الدنيا والقصوى للعقدة (إذا لم يكن الأمر كذلك، فإننا لا نستمر لهذه العقدة).
ثم نقوم بالحسابلكي تتداخل الفترات الزمنية داخل هذه العقدة (وليس أبنائها) مع فترة الاستعلام (مع العلم بذلك).):
ثم قم بإجراء استعلام على كومة الملفات الثنائية الخاصة بها لـأكبر من
ثم نمر عبر كل من الأبناء الأيسر والأيمن للعقدة، ونفعل الشيء نفسه.
في أسوأ الأحوال، يتعين علينا فحص جميع عقد شجرة البحث الثنائية، ولكن بما أن استعلام الكومة الثنائية هو الأمثل، فهذا مقبول (لا يمكن أن تكون المشكلة ثنائية الأبعاد مثالية في كلا البعدين).
من المتوقع أن تكون هذه الخوارزمية أسرع من شجرة الفترات التقليدية (الشجرة المعززة) في عمليات البحث. إضافة العناصر أبطأ قليلاً عملياً، مع أن ترتيب النمو يبقى نفسه.
مراجع
- ↑ "الهندسة الحسابية - استعلامات النوافذ" (ملف PDF) . مؤرشف من النسخة الأصلية (ملف PDF) بتاريخ 24-10-2022.
- 1 2 ينس م. شميدت . مسائل تحديد الفترات في نطاقات الأعداد الصحيحة الصغيرة . DOI . ISAAC'09، 2009
- ↑ استعلام النطاق (علوم الحاسوب)# عوامل شبه المجموعة
- مارك دي بيرج ، ومارك فان كريفيلد ، ومارك أوفرمارس ، وأوتفريد شوارزكوف . الهندسة الحسابية ، الطبعة الثانية المنقحة. Springer-Verlag 2000. القسم 10.1: الأشجار الفاصلة، الصفحات من 212 إلى 217.
- كورمين، توماس هـ . ليسرسون، تشارلز إي . ريفست، رونالد ل . شتاين ، كليفورد (2009)، مقدمة للخوارزميات ( الطبعة الثالثة)، مطبعة معهد ماساتشوستس للتكنولوجيا وماكجرو هيل، ISBN 978-0-262-03384-8
- فرانكو ب. بريباراتا ومايكل إيان شاموس . الهندسة الحسابية: مقدمة . سبرينغر-فيرلاغ، 1985
روابط خارجية
- مكتبة CGAL : مكتبة خوارزميات الهندسة الحسابية بلغة C++، تحتوي على تطبيق قوي لأشجار النطاق.
- توفر مكتبة Boost.Icl تطبيقات بلغة C++ لمجموعات الفترات والخرائط.
- IntervalTree (بايثون) - شجرة فترات مركزية مع موازنة AVL، متوافقة مع الفترات الموسومة
- شجرة الفترات (C#) - شجرة فترات مُوسّعة، مع موازنة AVL
- شجرة الفترات (روبي) - شجرة فترات مركزية، غير قابلة للتغيير، متوافقة مع الفترات الموسومة
- IntervalTree (جافا) - شجرة فترات مُعززة، مع موازنة AVL، ودعم التداخل، والبحث، وواجهة المجموعة، والفترات المرتبطة بالمعرف
- Tree::Interval::Fast (Perl/C) - إنشاء ومعالجة أشجار الفترات بكفاءة.
- شجرة البحث
