شجرة القطاعات

مثال توضيحي لهيكل شجرة القطاعات. تم إنشاء هذا المثال للقطاعات الموضحة في الأسفل.

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

تستخدم شجرة القطاعات لمجموعة I من n فترة تخزينًا قدره O ( n log n ) ويمكن إنشاؤها في زمن قدره O ( n log n ). تدعم أشجار القطاعات البحث عن جميع الفترات التي تحتوي على نقطة استعلام في زمن قدره O (log n + k )، حيث k هو عدد الفترات أو القطاعات المسترجعة. [ 1 ]

تُستخدم شجرة القطاعات في مجالات الهندسة الحسابية ونظم المعلومات الجغرافية والتعلم الآلي .

يمكن تعميم شجرة القطاعات لتشمل فضاءات ذات أبعاد أعلى .

تعريف

وصف

ليكن I مجموعة من الفترات، أو القطع المستقيمة. ولتكن p₁ , p₂ , ..., pₘ قائمة بنقاط نهاية الفترات المختلفة، مرتبة من اليسار إلى اليمين. لننظر إلى تقسيم خط الأعداد الحقيقية الناتج عن هذه النقاط. تُسمى مناطق هذا التقسيم بالفترات الأولية . وبالتالي، فإن الفترات الأولية هي، من اليسار إلى اليمين:

(-،ص1)،[ص1،ص1]،(ص1،ص2)،[ص2،ص2]،...،(صم-1،صم)،[صم،صم]،(صم،+){\displaystyle (-\infty ,p_{1}),[p_{1},p_{1}],(p_{1},p_{2}),[p_{2},p_{2}],\dots ,(p_{m-1},p_{m}),[p_{m},p_{m}],(p_{m},+\infty )}

أي أن قائمة الفترات الأولية تتكون من فترات مفتوحة بين نقطتي نهاية متتاليتين pᵢ و pᵢ + 1 ، بالتناوب مع فترات مغلقة تتكون من نقطة نهاية واحدة. تُعامل النقاط المفردة نفسها كفترات لأن إجابة الاستعلام ليست بالضرورة هي نفسها داخل الفترة الأولية ونقطتي نهايتها. [ 2 ]

بالنظر إلى مجموعة I من الفترات أو القطع، فإن شجرة القطع T لـ I يتم تنظيمها على النحو التالي:

  • T عبارة عن شجرة ثنائية .
  • تتوافق أوراقها مع الفترات الأولية الناتجة عن نقاط النهاية في I ، بطريقة مرتبة: تتوافق الورقة الموجودة في أقصى اليسار مع الفترة الموجودة في أقصى اليسار، وهكذا. يُرمز إلى الفترة الأولية المقابلة للورقة v بالرمز Int( v ).
  • تُقابل العقد الداخلية للشجرة T فتراتٍ هي اتحاد فتراتٍ أولية : الفترة Int( N ) المقابلة للعقدة N هي اتحاد الفترات المقابلة لأوراق الشجرة التي جذرها N. وهذا يعني أن Int( N ) هي اتحاد فترات فرعيها.
  • تخزن كل عقدة أو ورقة v في T الفترة Int( v ) ومجموعة من الفترات، ضمن بنية بيانات معينة. تحتوي هذه المجموعة الفرعية الأساسية للعقدة v على الفترات [ x , x ] من I بحيث تحتوي [ x , x ] على Int( v ) ولا تحتوي على Int(parent( v )). أي أن كل عقدة في T تخزن القطع المستقيمة التي تمتد عبر فترتها، ولكنها لا تمتد عبر فترة العقدة الأب. [ 3 ]

بناء

يمكن بناء شجرة قطاعات من مجموعة القطاعات I كما يلي: أولًا، تُرتَّب نهايات الفترات في I ، ومن ثم تُستخرج الفترات الأولية. بعد ذلك، تُبنى شجرة ثنائية متوازنة على الفترات الأولية، ويُحدَّد لكل عقدة v الفترة Int( v ) التي تُمثِّلها. يبقى حساب المجموعات الجزئية الأساسية للعقد. ولتحقيق ذلك، تُدرَج الفترات في I واحدة تلو الأخرى في شجرة القطاعات. يمكن إدراج فترة X = [ x , x ] في شجرة فرعية جذرها T ، باستخدام الإجراء التالي: [ 4 ]

  • إذا كان Int( T ) موجودًا في فقم بتخزين X في T ، ثم أنهِ العملية.
  • آخر:
    • إذا تقاطع X مع الفترة الخاصة بالفرع الأيسر لـ T ، فقم بإدخال X في ذلك الفرع، بشكل متكرر.
    • إذا تقاطع X مع فترة الابن الأيمن لـ T ، فقم بإدخال X في ذلك الابن، بشكل متكرر.

تستغرق عملية البناء الكاملة O ( n log n ) من الوقت، حيث n هو عدد الأجزاء في I.

دليل
يستغرق فرز نقاط النهاية O ( n log n ). ويستغرق بناء شجرة ثنائية متوازنة من نقاط النهاية المرتبة وقتًا خطيًا على n .
إدخال فترة X = [ x , x ] في الشجرة يكلف O(log n ).
دليل

تستغرق زيارة كل عقدة وقتًا ثابتًا (بافتراض تخزين المجموعات الجزئية الأساسية في بنية بيانات بسيطة مثل القائمة المتصلة ). عند زيارة العقدة v ، إما أن نخزن X في v ، أو أن Int( v ) يحتوي على نقطة نهاية X. كما هو موضح أعلاه، يتم تخزين الفاصل الزمني مرتين على الأكثر في كل مستوى من مستويات الشجرة. يوجد أيضًا عقدة واحدة على الأكثر في كل مستوى يحتوي فاصلها الزمني المقابل على x ، وعقدة واحدة على الأكثر يحتوي فاصلها الزمني على x . لذا، تتم زيارة أربع عقد على الأكثر لكل مستوى. بما أن عدد المستويات هو O (log n )، فإن التكلفة الإجمالية للإدراج هي O (log n ). [ 1 ]

استفسار

يستقبل الاستعلام عن شجرة القطاعات نقطة q x (يجب أن تكون واحدة من أوراق الشجرة)، ويسترجع قائمة بجميع القطاعات المخزنة التي تحتوي على النقطة q x .

بصورة رسمية؛ بالنظر إلى عقدة (شجرة فرعية) v ونقطة استعلام q x ، يمكن إجراء الاستعلام باستخدام الخوارزمية التالية:

  1. قم بالإبلاغ عن جميع الفترات في I ( v ) .
  2. إذا لم تكن v ورقة:
    • إذا كان q x ينتمي إلى مجموعة الأعداد الصحيحة (الابن الأيسر لـ v )، فإن
      • قم بإجراء استعلام في الفرع الأيسر من v .
    • إذا كان q x ينتمي إلى Int(الابن الأيمن لـ v ) فإن
      • قم بإجراء استعلام في الفرع الأيمن من v .

في شجرة القطاعات التي تحتوي على n فترات، يمكن الإبلاغ عن تلك التي تحتوي على نقطة استعلام معينة في وقت O (log n + k )، حيث k هو عدد الفترات المبلغ عنها.

دليل

تزور خوارزمية الاستعلام عقدة واحدة لكل مستوى من مستويات الشجرة، أي ما مجموعه O (log n ) عقدة. من جهة أخرى، عند العقدة v ، يتم الإبلاغ عن المقاطع في I في زمن قدره O (1 + kv ) ، حيث kv هو عدد الفترات الزمنية المُبلغ عنها عند العقدة v . مجموع جميع قيم kv لجميع العقد v التي تمت زيارتها هو k ، وهو عدد المقاطع المُبلغ عنها. [ 5 ]

متطلبات التخزين

تستخدم شجرة القطاعات T على مجموعة I من n فترات مساحة تخزين O ( n log n ).

اللمة - يتم تخزين أي فترة [ x , x ] من I في المجموعة الأساسية لعقدتين على الأكثر على نفس العمق.

دليل

لنفترض أن v1 و v2 و v3 هي العقد الثلاث الموجودة على نفس العمق، مرقمة من اليسار إلى اليمين؛ ولنفترض أن p( v ) هي العقدة الأب لأي عقدة v معينة. لنفترض أن [x, x′] مخزنة في v1 و v3. هذا يعني أن [x, x′ ] تغطي الفترة الكاملة من الطرف الأيسر لـ Int ( v1 ) إلى الطرف الأيمن لـ Int ( v3 ) . لاحظ أن جميع القطع في مستوى معين غير متداخلة ومرتبة من اليسار إلى اليمين: هذا صحيح بحكم التصميم للمستوى الذي يحتوي على الأوراق، ولا تُفقد هذه الخاصية عند الانتقال من أي مستوى إلى المستوى الذي فوقه بدمج أزواج من القطع المتجاورة. الآن، إما أن يكون parent( v2 ) = parent( v1 )، أو أن يكون الأول على يمين الثاني (الحواف في الشجرة لا تتقاطع). في الحالة الأولى، تكون النقطة اليسرى لـ Int(parent( v2 ) ) هي نفسها النقطة اليسرى لـ Int( v1 ). أما في الحالة الثانية، فتقع النقطة اليسرى لـ Int(parent( v2 ) ) على يمين النقطة اليمنى لـ Int(parent( v1 ) )، وبالتالي تقع أيضًا على يمين النقطة اليمنى لـ Int( v1 ). في كلتا الحالتين، يبدأ Int(parent( v2 )) عند النقطة اليسرى لـ Int( v1 ) أو على يمينها . وبالمثل، يتضح أن Int(parent( v2 ) ) ينتهي عند النقطة اليمنى لـ Int( v3 ) أو على يسارها . لذلك ، يجب أن يكون Int(parent( v2 ) ) موجودًا في [ x , x ]؛ ومن ثم، لن يتم تخزين [ x , x] في v2 .

تحتوي المجموعة I على 4n + 1 فترة أولية على الأكثر . ولأن T شجرة ثنائية متوازنة تحتوي على 4n + 1 ورقة على الأكثر ، فإن ارتفاعها هو O(log n ). وبما أن أي فترة تُخزَّن مرتين على الأكثر عند عمق معين من الشجرة، فإن إجمالي مساحة التخزين هو O ( n log n ). [ 5 ]

تعميم للأبعاد الأعلى

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

يؤدي استخدام التتالي الجزئي إلى تقليل حد وقت الاستعلام بمعامل لوغاريتمي. كما يؤدي استخدام شجرة الفترات على أعمق مستوى من الهياكل المرتبطة إلى تقليل حد التخزين بمعامل لوغاريتمي. [ 6 ]

ملحوظات

يُشار غالبًا إلى الاستعلام الذي يطلب جميع الفترات التي تحتوي على نقطة معينة باسم استعلام الطعن . [ 7 ]

تُعدّ شجرة القطاعات أقل كفاءة من شجرة الفترات في استعلامات النطاق في بُعد واحد، نظرًا لمتطلبات التخزين الأعلى: O ( n log n ) مقابل O( n ) لشجرة الفترات. تكمن أهمية شجرة القطاعات في إمكانية تخزين القطاعات داخل المجموعة الفرعية الأساسية لكل عقدة بأي طريقة ممكنة. [ 7 ]

بالنسبة للفترات n التي تقع نقاط نهايتها في نطاق عدد صحيح صغير (على سبيل المثال، في النطاق [1، ...، O ( n )])، توجد هياكل بيانات مثالية بوقت معالجة مسبقة خطي ووقت استعلام O (1 + k ) للإبلاغ عن جميع الفترات k التي تحتوي على نقطة استعلام معينة.

من مزايا شجرة القطاعات الأخرى سهولة تكييفها مع استعلامات العد؛ أي الإبلاغ عن عدد القطاعات التي تحتوي على نقطة معينة، بدلاً من الإبلاغ عن القطاعات نفسها. فبدلاً من تخزين الفترات في المجموعات الفرعية المتعارف عليها، يمكنها ببساطة تخزين عددها. تستخدم شجرة القطاعات هذه تخزينًا خطيًا، وتتطلب زمن استعلام قدره O (log n )، مما يجعلها مثالية. [ 8 ]

لا توجد نسخ ذات أبعاد أعلى من شجرة الفترات وشجرة البحث ذات الأولوية ؛ أي أنه لا يوجد امتداد واضح لهذه البنى يحل المشكلة المماثلة في الأبعاد الأعلى. ولكن يمكن استخدام هذه البنى كبنية مرتبطة بأشجار القطاعات. [ 6 ]

تاريخ

ابتكر جون بنتلي شجرة القطاعات في عام 1977؛ في "حلول لمسائل المستطيل لكلي". [ 7 ]

مراجع

المصادر المذكورة