شجرة فينويك
شجرة فينويك أو الشجرة المفهرسة الثنائية (BIT) هي بنية بيانات تخزن مصفوفة من القيم، وتستطيع حساب المجاميع الجزئية لهذه القيم بكفاءة وتحديثها . كما تدعم عملية بحث فعّالة عن الترتيب لإيجاد أطول جزء جزئي لا يتجاوز مجموعه قيمة محددة. ويُستخدم هذا النوع من الأشجار بشكل أساسي في معالجة دالة التوزيع التراكمي لجدول التكرار الإحصائي الذي يتم تحديثه باستمرار.
اقترح بوريس ريابكو هذا الهيكل في عام 1989 [ 1 ] مع تعديل إضافي نُشر في عام 1992. [ 2 ] وقد عُرف لاحقًا باسم شجرة فينويك نسبةً إلى بيتر فينويك، الذي وصف هذا الهيكل في مقالته عام 1994. [ 3 ]
يُعد تحديث مصفوفة بسيطة من القيم أمرًا بسيطًا (زمن ثابت)، ولكنه يتطلبالوقت اللازم لحساب مجموع البادئة أو البحث عن طول البادئة.
يمكن لمصفوفة من المجاميع الجزئية أن تُعيد مجموعًا جزئيًا في وقت ثابت، وأن تبحث عن طول جزئي فيالوقت، ولكنه يتطلب ذلكحان وقت تحديث إحدى القيم.
تتيح شجرة فينويك تنفيذ العمليات الثلاث جميعها فيالوقت. ويتحقق ذلك من خلال تمثيل القيم كشجرة باستخدامتحتوي الشجرة على عقد، حيث تخزن كل عقدة فيها مجموع القيم من فهرس العقدة الأب (باستثناء فهرس العقدة الأب) إلى فهرس العقدة نفسها (بما في ذلك فهرس العقدة الأب). الشجرة نفسها ضمنية ويمكن تخزينها كمصفوفة منالقيم، مع حذف العقدة الجذرية الضمنية من المصفوفة. يسمح هيكل الشجرة بإجراء عمليات استرجاع القيم، وتحديث القيم، والمجموع البادئ، والمجموع النطاقي باستخدام القيم فقط.الوصول إلى العقدة.
تحفيز
عند وجود مصفوفة من القيم، قد يكون من المرغوب فيه أحيانًا حساب المجموع التراكمي للقيم حتى كل فهرس وفقًا لعملية ثنائية ترابطية (تُعد عملية الجمع على الأعداد الصحيحة الأكثر شيوعًا). توفر أشجار فينويك طريقة للاستعلام عن المجموع التراكمي عند أي فهرس، أو المجموع البادئ، مع السماح بإجراء تغييرات على مصفوفة القيم الأساسية، بحيث تعكس جميع الاستعلامات اللاحقة هذه التغييرات.
صُممت أشجار فينويك خصيصًا لتطبيق الترميز الحسابي التكيفي ، الذي يحتفظ بعدد مرات ظهور كل رمز مُنتَج، ويحتاج إلى تحويل هذه الأعداد إلى الاحتمالية التراكمية لظهور رمز أقل من رمز مُحدد. وقد استُلهم تطوير العمليات التي تدعمها هذه الأشجار بشكل أساسي من استخدامها في هذه الحالة.
وصف
شجرة فينويك هي شجرة ضمنية حيث يتم ترقيم العقد بشكل متسلسل، ويتم تحديد علاقات الأصل والفرع عن طريق العمليات الحسابية على مؤشرات العقد.
تُعدّ أقل بتة مُفعّلة ذات دلالة وظيفةً مهمةً في حساب الفهرس هذا . وهي أكبر قوة للعدد اثنين التي تقسم الفهرس.هذا هو قوة العدد اثنين (1، 2، 4، 8، ...) وليس الأس (0، 1، 2، 3، ...). ويمكن حسابه بكفاءة باستخدام حساب المتمم الثنائي كما يلي:(حيث يشير الرمز & إلى عملية AND الثنائية ).
يسهل فهم شجرة فينويك باستخدام مصفوفة تبدأ من واحدمعالقيم. باستخدام صيغة الفاصل الزمني نصف المفتوح ، دعالنطاق من(حصري) إلى(شاملة). مجموعة فينويك المقابلةيخزن مجاميع النطاقأي مجموعالقيم التي تنتهي بـ و تشمل.
يتم استخدام عقدة وهمية رقم 0 في بعض الأوصاف، ولكن لا يتم الوصول إليها فعليًا ولا يلزم تخزينها بشكل صريح. لكن القيمة لا تكون مطلوبة في الواقع. يمكن اعتبارها تحتوي على مجموع النطاق الفارغبقيمة 0.
شجرة فينويك هي في الواقع ثلاث أشجار ضمنية على نفس المصفوفة: شجرة الاستعلام المستخدمة لترجمة الفهارس إلى مجاميع بادئة، وشجرة التحديث المستخدمة لتحديث العناصر، وشجرة البحث المستخدمة لترجمة المجاميع البادئة إلى فهارس (استعلامات الترتيب). [ 4 ] عادةً ما يتم تتبع الشجرتين الأوليين تصاعديًا، بينما يتم تتبع الثالثة تنازليًا.
شجرة الاستجواب
يتم تعريف شجرة الاستجواب بحيث يكون الأصل للعقدةيكونعلى سبيل المثال، الأصل للعدد 6 = 110 2 هو العدد 4 = 100 2. العقدة الضمنية 0 هي الجذر.
كل مستوىتحتوي الشجرة على عقد ذات مؤشرات تتوافق مع مجاميع منقوى مميزة للعدد 2 (معيمثل مجموعًا فارغًا (0). على سبيل المثال، المستوىيحتوي على عقدوالمستوىيحتوي على عقد
العقدةلديهأطفال ()، وإجمالي النسل. (تشمل هذه الأرقام العقد الأكبر من(والتي يتم حذفها ولا يتم الوصول إليها مطلقًا.)
يوضح الرسم التخطيطي أدناه بنية شجرة استعلام شجرة فينويك المكونة من 16 عقدة، بما في ذلك الجذر، بحيث تتوافق مع مصفوفة A المكونة من 15 عنصرًا:

لإيجاد المجموع البادئ، اجمع القيم في، ووالده، ووالد والده، وهكذا حتى الجذر (ولكن ليس بما فيه). لحساب مجموع النطاقاطرح المجاميع البادئة لـو.
يمكن تحسين ذلك بالتوقف عند أول سلف مشترك لهم. ومن الأمثلة المتطرفة طلب مدخل واحد فقط.في هذه الحالة، السلف المشترك لـويكونلذا ابدأ بـوبعد ذلك، طالمااطرحوتحديث .i := i - lsb(i)
شجرة التحديث
شجرة التحديث هي صورة معكوسة لشجرة الاستعلام. الأصل للعقدةيكون(حيث يرمز الرمز | إلى عملية OR الثنائية ). على سبيل المثال، العدد الأب للعدد 6 = 110 2 هو العدد 8 = 1000 2 .
هذه الشجرة المفاهيمية لا نهائية، ولكن فقط الجزء الذي يحتوي على فهارس تصل إلىيتم تخزينها أو استخدامها. باستثناء العقد الوهمية ذات الفهارس الأكبر منستكون غابة من الأشجار المنفصلة، شجرة لكل بت مُعيّن في التمثيل الثنائي لـ.
هنا، أسلاف العقدة هي جميع العقد التي تشمل مجاميع نطاقاتها نطاقها. على سبيل المثال،يحتوي على مجموع،يحتوي على مجموعوهكذا دواليك.
لتعديل إحدى القيمأضف التغيير إلى، ثمثم جده، وهكذا، حتى يتجاوز الفهرس.
شجرة البحث
على عكس الشجرتين الأخريين، فإن شجرة البحث هذه هي شجرة ثنائية ، مرتبة بترتيب يسميه كنوت "كومة جانبية". [ 5 ] يُخصص لكل عقدة ارتفاع يساوي عدد الأصفار اللاحقة في التمثيل الثنائي لفهرسها، مع كون الأب والأبناء هم أقرب فهرس (أو فهارس) عدديًا للارتفاع المجاور. العقد ذات الفهارس الفردية () هي أوراق. العقد ذات الفهارس الزوجية يكون أقرب عقدتين من الفهرس الأدنى التالي بمثابة أبناء لها.. عقدةالأصل في شجرة البحث هو.
على سبيل المثال، أبناء العدد 6 = 110 2 هم 5 = 101 2 و 7 = 111 2 ، ووالده هو 4 = 100 2 .
على الرغم من أن هذه الشجرة قد تكون لانهائية، إلا أنه يمكننا تعريف جذرها بأنه أعلى عقدة موجودة ، ويكون فهرسها أكبر قوة للعدد 2 أقل من أو يساوي.
من الممكن أن يكون للعقدة أب وهمي بفهرس أكبر منومع ذلك، لا يزال للعقدة جدٌّ موجود. إذا انطبق المثال أعلاه على شجرة مكونة من 5 عقد، فإن العقدة 5 سيكون لها أبٌ وهمي 6، ولكن جدٌّ موجود 4.
يمكن اعتبار شجرة البحث مزيجًا من الشجرتين السابقتين. تحتوي الشجرة الفرعية اليسرى للعقدة على جميع فروعها في شجرة التحديث، بينما تحتوي شجرتها الفرعية اليمنى على جميع فروعها في شجرة الاستعلام. يكون والد العقدة في شجرة البحث إما والد الاستعلام أو والد التحديث (بحسب ما إذا كانت العقدة فرعًا أيمن أو أيسر على التوالي)، ويمكن العثور على النوع الآخر من الآباء من خلال عدة خطوات تصاعدية في شجرة البحث.
مع ذلك، فإن عمليات التصفح التصاعدي في شجرة البحث غير شائعة؛ إذ يُستخدم بشكل أساسي لإجراء استعلامات الترتيب: عند إعطاء مجموع بادئة، ما هو فهرس ظهوره؟ ويتم ذلك من خلال تصفح تنازلي عبر شجرة البحث. أثناء التصفح، يتم الاحتفاظ بثلاثة متغيرات: فهرس العقدة الحالية، والترتيب المطلوب في الشجرة الفرعية المتفرعة من العقدة الحالية، و"فهرس احتياطي" يُعاد إذا كان الترتيب المطلوب أكبر من الترتيب الموجود في الشجرة الفرعية.
في البداية، تكون العقدة الحالية هي الجذر، والرتبة المطلوبة هي الاستعلام الأصلي، وفهرس الاحتياط هو قيمة "تجاوز" خاصة تشير إلى أن الرتبة غير موجودة في الشجرة. (بحسب التطبيق،أو(يمكن استخدامها لهذا الغرض.)
في كل خطوة، إما أن تكون العقدة الحالية عقدة وهمية (مؤشر أكبر منأو يجب أن نقرر ما إذا كان الموضع المطلوب يقع على يسار أو يمين نهاية العقدة الحالية. إذا كانت الرتبة المطلوبة أقل من قيمة مصفوفة فينويكبالنسبة للعقدة الحالية، يجب البحث في شجرتها الفرعية اليسرى. إذا كانت أكبر، يتم البحث في شجرتها الفرعية اليمنى. أما إذا كانت مساوية، فيعتمد الاتجاه المختار على كيفية رغبتك في التعامل مع عمليات البحث عن المجاميع الواقعة تمامًا بين عقدتين.
ثم يتم تقسيم هذه الاحتمالات الثلاثة بشكل أكبر بناءً على ما إذا كانت العقدة الحالية ورقة أم لا:
- إذا كانت العقدة الحالية عقدة طرفية و:
- الهدف موجود في الشجرة الفرعية اليسرى (الفارغة)، أعد الفهرس الحالي.
- إذا كان الهدف وهميًا أو موجودًا في الشجرة الفرعية اليمنى، فأرجع فهرس الاحتياط.
- إذا لم تكن العقدة الحالية عقدة طرفية و:
- إنه وهمي، ابحث عن نفس الرتبة في شجرته الفرعية اليسرى مع فهرس احتياطي لم يتغير.
- إذا كان الهدف موجودًا في الشجرة الفرعية اليسرى، فابحث عن نفس الرتبة في الشجرة الفرعية اليسرى باستخدام الفهرس الحالي كفهرس احتياطي.
- إذا كان الهدف موجودًا في الشجرة الفرعية اليمنى، فابحث عن رتبة الهدف مطروحًا منها قيمة العقدة الحالية في الشجرة الفرعية اليمنى، مع بقاء فهرس التراجع دون تغيير.
الشفرة الزائفة
فيما يلي تطبيق بسيط باستخدام الشفرة الزائفة للعمليتين الرئيسيتين على شجرة فينويك - الاستعلام والتحديث:
الدالة query(tree, index) هي المجموع := 0 بينما يكون المؤشر أكبر من 0، نفّذ sum += tree[index] index -= lsb(index) إرجاع المجموع دالة التحديث (الشجرة، الفهرس، القيمة) تقوم بما يلي: طالما أن الفهرس < حجم الشجرة، نفّذ tree[index] += value index += lsb(index)
الوظيفةيحسب أقل بت مُفعّل ذي أهمية من البت المُعطىأو، بصورة مكافئة، أكبر قوة للعدد اثنين التي تُعد أيضًا قاسمًا لـ. على سبيل المثال،كما هو موضح في تمثيله الثنائي:يمكن تنفيذ هذه الوظيفة ببساطة في الكود من خلال عملية AND الثنائيةlsb(n) = n & (-n) ، بافتراض نفي المتمم الثنائي . [ 3 ]
بناء
إحدى الخوارزميات البسيطة لإنشاء شجرة فينويك هي تهيئة الشجرة بقيم فارغة وتحديث كل فهرس على حدة. يعمل هذا الحل فيالوقت، ولكنالبناء ممكن: [ 6 ]
الدالة construct(values) هي tree := values لكل فهرس من 1 إلى حجم(الشجرة) نفّذ parentIndex := index + lsb(index) إذا كان parentIndex < size(tree) tree[parentIndex] += tree[index] شجرة العودة
انظر أيضاً
مراجع
- ↑ بوريس ريابكو (1989). "برنامج سريع عبر الإنترنت" (ملف PDF) . مجلة الرياضيات السوفيتية . 39 (3): 533-537 . مؤرشف (ملف PDF) من الأصل بتاريخ 17 يوليو 2019. تم الاطلاع عليه بتاريخ 17 يوليو 2019 .
- ↑ بوريس ريابكو (1992). "رمز تكيفي سريع عبر الإنترنت" (ملف PDF) . معاملات IEEE في نظرية المعلومات . 28 (1): 1400-1404 . مؤرشف (ملف PDF) من الأصل بتاريخ 14 يوليو 2019. تم الاطلاع عليه بتاريخ 14 يوليو 2019 .
- 1 2 بيتر م. فينويك (1994). "بنية بيانات جديدة لجداول التكرار التراكمي". البرمجيات: الممارسة والخبرة . 24 (3): 327-336 . CiteSeerX 10.1.1.14.8917 . doi : 10.1002/spe.4380240306 . S2CID 7519761 .
- ↑ مارشيني، ستيفانو؛ فيجنا، سيباستيانو (14 أكتوبر 2019). "أشجار فينويك المدمجة للتصنيف والاختيار الديناميكي". arXiv : 1904.12370 [ cs.DS ]. مناقشة مستفيضة لتفاصيل التنفيذ العملي.
- ↑ كنوت، دونالد (2011). الخوارزميات التوافقية، الجزء 1. فن برمجة الحاسوب . المجلد 4أ. أبر سادل ريفر، نيوجيرسي: أديسون-ويسلي بروفيشنال. الصفحات 164-165 .
- ^ حليم، ستيفن. حليم، فيليكس؛ أفندي ، سوهندري (3 ديسمبر 2018). البرمجة التنافسية 4 . المجلد. 1. مطبعة اللولو، إنكوربوريتد. رقم ISBN 978-1-716-74552-2.
روابط خارجية
- الأشجار (هياكل البيانات)
- الاختراعات السوفيتية
- الاختراعات الروسية
