شجرة كبش الفداء

في علم الحاسوب ، شجرة كبش الفداء هي شجرة بحث ثنائية متوازنة ذاتيًا ، ابتكرها آرني أندرسون [ 2 ] عام 1989، ثم أعاد إيغال غالبرين ورونالد إل. ريفست ابتكارها عام 1993. [ 1 ] وهي توفر أسوأ الحالاتيا(سجلن){\displaystyle {\color {Blue}O(\log n)}}وقت البحث (معن{\displaystyle n}(باعتبارها عدد المدخلات) ويا(سجلن){\displaystyle O(\log n)}وقت الإدخال والحذف المستهلك .

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

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

نظرية

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

size(left) ≤ α*size(node) size(right) ≤ α*size(node)

حيث يمكن تعريف الحجم بشكل متكرر على النحو التالي:

دالة size(node) هي إذا كان node = nil، فأرجع 0 ، وإلا فأرجع size(node->left) + size(node->right) + 1. نهاية الشرط. نهاية الدالة .

حتى الشجرة المنحلة (القائمة المرتبطة) تفي بهذا الشرط إذا كانت α=1، في حين أن α=0.5 لن تتطابق إلا مع الأشجار الثنائية شبه الكاملة .

يجب أن تكون شجرة البحث الثنائية المتوازنة الوزن α متوازنة الارتفاع α أيضًا ، أي

ارتفاع(الشجرة) ≤ الجزء الصحيح من(لوغاريتم 1/α (حجم(الشجرة)))

وبالعكس ، فإن الشجرة التي لا تتمتع بتوازن في الارتفاع α لا تتمتع بتوازن في الوزن α.

لا يُضمن لأشجار كبش الفداء الحفاظ على توازن الوزن ألفا في جميع الأوقات، ولكنها دائمًا ما تكون متوازنة الارتفاع ألفا بشكل فضفاض من حيث ذلك

ارتفاع (شجرة كبش الفداء) ≤ الجزء السفلي (لوغاريتم 1/α (حجم (الشجرة))) + 1.

يمكن اكتشاف انتهاكات شرط توازن الارتفاع هذا في وقت الإدخال، وهذا يعني بالضرورة وجود انتهاك لشرط توازن الوزن.

هذا يجعل أشجار كبش الفداء مشابهة لأشجار الأحمر والأسود من حيث وجود قيود على ارتفاعها. إلا أنها تختلف اختلافًا كبيرًا في كيفية تحديد مواقع عمليات التدوير (أو إعادة التوازن في حالة أشجار كبش الفداء). فبينما تخزن أشجار الأحمر والأسود معلومات "لون" إضافية في كل عقدة لتحديد الموقع، تبحث أشجار كبش الفداء عن كبش فداء غير متوازن الوزن (α-weight) لإجراء عملية إعادة التوازن عليه. وهذا يشبه إلى حد ما أشجار AVL ، حيث تعتمد عمليات التدوير الفعلية على "توازن" العقد، لكن طريقة تحديد التوازن تختلف اختلافًا كبيرًا. فنظرًا لأن أشجار AVL تتحقق من قيمة التوازن عند كل عملية إدراج/حذف، فإنها تُخزن عادةً في كل عقدة؛ بينما تستطيع أشجار كبش الفداء حسابها عند الحاجة فقط، أي عند الحاجة إلى إيجاد كبش فداء.

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

العمليات

ابحث عن

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

الإدخال

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

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

لإعادة التوازن، تخضع شجرة فرعية كاملة، متجذرة في عقدة مُستَغَلّة، لعملية موازنة. تُعرَّف العقدة المُستَغَلّة بأنها سلف للعقدة المُدرَجة غير متوازنة الوزن (α-weight). سيكون هناك دائمًا سلف واحد على الأقل من هذا النوع. إعادة موازنة أيٍّ منها ستُعيد خاصية التوازن في الارتفاع (α-height-balance).

إحدى طرق إيجاد كبش فداء هي الصعود من العقدة الجديدة إلى الجذر واختيار أول عقدة غير متوازنة الوزن α.

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

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

size(left) ≤ α*size(node) size(right) ≤ α*size(node)

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

لنأخذ المثال التالي لتوضيح ذلك. بافتراض أننا نصعد عائدين إلى الجذر:

حجم (الأصل) = حجم (العقدة) + حجم (الشقيق) + 1

لكن كما يلي:

حجم (العقدة المُدرجة) = 1.

يمكن اختزال القضية إلى ما يلي:

الحجم[س+1] = الحجم[س] + حجم(الشقيق) + 1

حيث x = هذه العقدة، x + 1 = الأصل وحجم (الشقيق) هو استدعاء الدالة الوحيد المطلوب فعليًا.

بمجرد العثور على كبش الفداء، يُعاد بناء الشجرة الفرعية المتفرعة منه بالكامل لتكون متوازنة تمامًا. [ 1 ] يمكن القيام بذلك فييا(ن){\displaystyle O(n)}يتم حساب الوقت عن طريق اجتياز عقد الشجرة الفرعية للعثور على قيمها بترتيب تصاعدي واختيار الوسيط بشكل متكرر كجذر للشجرة الفرعية.

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

رسم تخطيطي لإثبات تكلفة الإدراج

تتميز أشجار كبش الفداء بتوازن غير دقيق في الارتفاع، حيث يبلغ ارتفاعها على الأكثرسجل1/αن{\displaystyle \lfloor \log _{1/\alpha }n\rfloor }، وهويا(سجلن){\displaystyle O(\log n)}بشرط أن تكون قيمة α بين 0.5 و 1. تكون تكلفة إيجاد نقطة الإدخال ووضع العقدة محدودة بالارتفاع، وهويا(سجلن){\displaystyle O(\log n)}بعد عملية الإضافة، قد تتم إعادة التوازن، وقد تصل التكلفة إلىيا(ن){\displaystyle O(n)}سنوضح الآن أن تكلفة إعادة التوازن يتم استهلاكهايا(سجلن){\displaystyle O(\log n)}لكل عملية إدخال.

يُعرَّف عدم توازن العقدة v بأنه القيمة المطلقة للفرق في الحجم بين عقدتها اليسرى وعقدتها اليمنى ناقص 1، أو 0، أيهما أكبر. بعبارة أخرى:

أنا(v)=الأعلى(|غادر(v)-يمين(v)|-1،0){\displaystyle I(v)=\operatorname {max} (|\operatorname {left} (v)-\operatorname {right} (v)|-1,0)}

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

اللمة 1: مباشرة قبل إعادة بناء الشجرة الفرعية المتجذرة فيv{\displaystyle v}، أنا(v)Ω(|v|){\displaystyle I(v)\in \Omega (|v|)} (Ωأوميغا( تدوين أوميغا الكبيرة .)

دليل:

بحسب التعريف، فإن عقدة كبش الفداء ليست متوازنة الوزن ألفا، وبالتالي فإن حجم الشجرة الفرعية التابعة لها لا يقل عنα|v|{\displaystyle \alpha |v|}ويكون حجم الشجرة الفرعية الشقيقة على الأكثر(1-α)|v|{\displaystyle (1-\alpha )|v|}عدم توازن العقدةv{\displaystyle v}ثمأنا(v)|α|v|-(1-α)|v||-1=|2α-1||v|-1{\displaystyle I(v)\geq |\alpha |v|-(1-\alpha )|v||-1=|2\alpha -1||v|-1}وα>0.5{\displaystyle \alpha >0.5}ثابت ثابت،أنا(V)=Ω(|V|){\displaystyle I(V)=\Omega (|V|)}وبالتالي، فإن عدم توازن الشجرة الفرعية المتجذرة فيv{\displaystyle v}وهو أيضًاΩ(|V|){\displaystyle \Omega (|V|)}.

اللمة 2: مباشرة بعد إعادة بناء شجرة فرعية متجذرة فيv{\displaystyle v}،أنا(v)=0{\displaystyle I(v)=0}.

دليل:

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

النظرية 3: التكلفة المستهلكة للإدراج هييا(سجلن){\displaystyle O(\log n)}.

دليل:

مثل أييا(|v|){\displaystyle O(|v|)}إعادة البناء تقللأنا(v){\displaystyle I(v)}بواسطةΩ(|v|)-0=Ω(|v|){\displaystyle \Omega (|v|)-0=\Omega (|v|)}بحسب اللمتين 1 و2، فإن تكلفة إصلاح كل وحدة من وحدات عدم التوازن هي

يا(|v|)Ω(|v|)=يا(1){\displaystyle {O(|v|) \over \Omega (|v|)}=O(1)}.

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

يا(سجلن)يا(1)=يا(سجلن){\displaystyle O(\log n)O(1)=O(\log n)}.

وبإضافة تكاليف مرحلة البحث الأولية وإعادة التوازن، تصبح التكلفة المستهلكة للإدراج هي

يا(سجلن)+يا(سجلن)=يا(سجلن){\displaystyle O(\log n)+O(\log n)=O(\log n)}.

ينطبق هذا الحد على جميع القيم 0.5 < α < 1.

الحذف

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

لإجراء عملية حذف، نقوم ببساطة بإزالة العقدة كما تفعل في شجرة بحث ثنائية بسيطة، ولكن إذا

عدد العقد ≤ α*الحد الأقصى لعدد العقد

ثم نعيد موازنة الشجرة بأكملها حول الجذر، مع تذكر ضبط MaxNodeCount على NodeCount.

وهذا يعطي عملية الحذف أسوأ أداء في أسوأ الحالات.يا(ن){\displaystyle O(n)}الوقت، بينما الوقت المستهلك هويا(سجلن){\displaystyle O(\log n)}.

رسم تخطيطي لإثبات تكلفة الحذف

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

1ن/2يا(سجلن)+يا(ن)ن/2=ن2يا(سجلن)+يا(ن)ن/2=يا(سجلن) {\displaystyle {\sum _{1}^{n/2}O(\log n)+O(n) \over n/2}={{n \over 2}O(\log n)+O(n) \over n/2}=O(\log n)\ }

أصل الكلمة

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

انظر أيضاً

مراجع

  1. 1 2 3 4 5 6 7 غالبرين، إيغال؛ ريفست، رونالد ل. (1993). أشجار كبش الفداء (ملف PDF) . وقائع الندوة السنوية الرابعة لجمعية ACM-SIAM حول الخوارزميات المنفصلة . فيلادلفيا: جمعية الرياضيات الصناعية والتطبيقية . الصفحات 165-174 . CiteSeerX 10.1.1.309.9376 . ISBN   0-89871-313-7.
  2. أندرسون، آرني (1989). تحسين إعادة البناء الجزئي باستخدام معايير توازن بسيطة . وقائع ورشة عمل حول الخوارزميات وهياكل البيانات. مجلة الخوارزميات . سبرينغر-فيرلاغ. ص 393-402 . CiteSeerX 10.1.1.138.4859 . doi : 10.1007/3-540-51542-9_33 .  
  3. مورين، بات . "الفصل 8 - أشجار كبش الفداء" . هياكل البيانات المفتوحة (بالشفرة الزائفة) ( طبعة 0.1 جيجابايت) . تم الاسترجاع في 16-09-2017 .