شجرة فينويك

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

اقترح بوريس ريابكو هذا الهيكل في عام 1989 [ 1 ] مع تعديل إضافي نُشر في عام 1992. [ 2 ] وقد عُرف لاحقًا باسم شجرة فينويك نسبةً إلى بيتر فينويك، الذي وصف هذا الهيكل في مقالته عام 1994. [ 3 ]

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

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

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

تحفيز

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

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

وصف

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

تُعدّ أقل بتة مُفعّلة ذات دلالة وظيفةً مهمةً في حساب الفهرس هذا . وهي أكبر قوة للعدد اثنين التي تقسم الفهرس.أنا{\displaystyle i}هذا هو قوة العدد اثنين (1، 2، 4، 8، ...) وليس الأس (0، 1، 2، 3، ...). ويمكن حسابه بكفاءة باستخدام حساب المتمم الثنائي كما يلي:lsb(أنا)=أناو-أنا{\displaystyle \operatorname {lsb} (i)=i\mathbin {\&} -i}(حيث يشير الرمز & إلى عملية AND الثنائية ).

يسهل فهم شجرة فينويك باستخدام مصفوفة تبدأ من واحدأ[ن]{\displaystyle A[n]}معن{\displaystyle n}القيم. باستخدام صيغة الفاصل الزمني نصف المفتوح ، دعأ(أنا،ج]={أ[ك]}ك=أنا+1ج،{\displaystyle A(i,j]=\{A[k]\}_{k=i+1}^{j},}النطاق منأنا{\displaystyle i}(حصري) إلىج{\displaystyle j}(شاملة). مجموعة فينويك المقابلةF[ن]{\displaystyle F[n]}يخزن مجاميع النطاقF[أنا]=أ(أنا-lsb(أنا)،أنا]{\displaystyle \textstyle F[i]=\sum A(i-\operatorname {lsb} (i),i]}أي مجموعlsb(أنا){\displaystyle \operatorname {lsb} (i)}القيم التي تنتهي بـ و تشملأ[أنا]{\displaystyle A[i]}.

يتم استخدام عقدة وهمية رقم 0 في بعض الأوصاف، ولكن لا يتم الوصول إليها فعليًا ولا يلزم تخزينها بشكل صريح. lsb(0)=،{\displaystyle \operatorname {lsb} (0)=\infty ,}لكن القيمة لا تكون مطلوبة في الواقع. F[0]{\displaystyle F[0]}يمكن اعتبارها تحتوي على مجموع النطاق الفارغأ(0،0]={}{\displaystyle A(0,0]=\{\}}بقيمة 0.

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

شجرة الاستجواب

يتم تعريف شجرة الاستجواب بحيث يكون الأصل للعقدةأنا{\displaystyle i}يكونأنا-lsb(أنا)=أناو(أنا-1){\displaystyle i-\operatorname {lsb} (i)=i\mathbin {\&} (i-1)}على سبيل المثال، الأصل للعدد 6 = 110 2 هو العدد 4 = 100 2. العقدة الضمنية 0 هي الجذر.

كل مستوىك{\displaystyle k}تحتوي الشجرة على عقد ذات مؤشرات تتوافق مع مجاميع منك{\displaystyle k}قوى مميزة للعدد 2 (معك=0{\displaystyle k=0}يمثل مجموعًا فارغًا (0). على سبيل المثال، المستوىك=1{\displaystyle k=1}يحتوي على عقد1=20،2=21،4=22،...{\displaystyle 1=2^{0},2=2^{1},4=2^{2},...}والمستوىك=2{\displaystyle k=2}يحتوي على عقد3=21+20،5=22+20،6=22+21،...{\displaystyle 3=2^{1}+2^{0},5=2^{2}+2^{0},6=2^{2}+2^{1},...}

العقدةأنا{\displaystyle i}لديهسجل2(lsb(أنا)){\displaystyle \log _{2}(\operatorname {lsb} (i))}أطفال (أنا+1،أنا+2،أنا+4،...،أنا+lsb(أنا)/2{\displaystyle i+1,i+2,i+4,...,i+\operatorname {lsb} (i)/2})، وlsb(أنا){\displaystyle \operatorname {lsb} (i)}إجمالي النسل. (تشمل هذه الأرقام العقد الأكبر منن{\displaystyle n}(والتي يتم حذفها ولا يتم الوصول إليها مطلقًا.)

يوضح الرسم التخطيطي أدناه بنية شجرة استعلام شجرة فينويك المكونة من 16 عقدة، بما في ذلك الجذر، بحيث تتوافق مع مصفوفة A المكونة من 15 عنصرًا:

رسم توضيحي لشجرة استجواب فينويك ذات 16 عقدة تحتوي على مجاميع نطاقات لمصفوفة مكونة من 15 عقدة A

لإيجاد المجموع البادئأ[1]++أ[أنا]{\displaystyle A[1]+\cdots +A[i]}، اجمع القيم فيأنا{\displaystyle i}، ووالده، ووالد والده، وهكذا حتى الجذر (ولكن ليس بما فيه). لحساب مجموع النطاقأ[أنا]++أ[ج]{\displaystyle A[i]+\cdots +A[j]}اطرح المجاميع البادئة لـأنا-1{\displaystyle i-1}وج{\displaystyle j}.

يمكن تحسين ذلك بالتوقف عند أول سلف مشترك لهم. ومن الأمثلة المتطرفة طلب مدخل واحد فقط.أ[ج]{\displaystyle A[j]}في هذه الحالة، السلف المشترك لـج{\displaystyle j}وأنا=ج-1{\displaystyle i=j-1}يكونج-lsb(ج){\displaystyle j-\operatorname {lsb} (j)}لذا ابدأ بـF[ج]{\displaystyle F[j]}وبعد ذلك، طالماأناج-lsb(ج){\displaystyle i\neq j-\operatorname {lsb} (j)}اطرحF[أنا]{\displaystyle F[i]}وتحديث .i := i - lsb(i)

شجرة التحديث

شجرة التحديث هي صورة معكوسة لشجرة الاستعلام. الأصل للعقدةأنا{\displaystyle i}يكونأنا+lsb(أنا)=(أنا|(أنا-1))+1{\displaystyle i+\operatorname {lsb} (i)=(i\mathbin {|} (i-1))+1}(حيث يرمز الرمز | إلى عملية OR الثنائية ). على سبيل المثال، العدد الأب للعدد 6 = 110 2 هو العدد 8 = 1000 2 .

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

هنا، أسلاف العقدة هي جميع العقد التي تشمل مجاميع نطاقاتها نطاقها. على سبيل المثال،F[6]{\displaystyle F[6]}يحتوي على مجموعأ(4،6]{\displaystyle A(4,6]}،F[8]{\displaystyle F[8]}يحتوي على مجموعأ(0،8]{\displaystyle A(0,8]}وهكذا دواليك.

لتعديل إحدى القيمأ[أنا]{\displaystyle A[i]}أضف التغيير إلىF[أنا]{\displaystyle F[i]}، ثمأنا{\displaystyle i}ثم جده، وهكذا، حتى يتجاوز الفهرسن{\displaystyle n}.

شجرة البحث

على عكس الشجرتين الأخريين، فإن شجرة البحث هذه هي شجرة ثنائية ، مرتبة بترتيب يسميه كنوت "كومة جانبية". [ 5 ] يُخصص لكل عقدة ارتفاع يساوي عدد الأصفار اللاحقة في التمثيل الثنائي لفهرسها، مع كون الأب والأبناء هم أقرب فهرس (أو فهارس) عدديًا للارتفاع المجاور. العقد ذات الفهارس الفردية (lsb(أنا)=1{\displaystyle \operatorname {lsb} (i)=1}) هي أوراق. العقد ذات الفهارس الزوجية يكون أقرب عقدتين من الفهرس الأدنى التالي بمثابة أبناء لها.أنا±lsb(أنا)/2{\displaystyle i\pm \operatorname {lsb} (i)/2}. عقدةأنا{\displaystyle i}الأصل في شجرة البحث هو(أنا-lsb(أنا))|(2lsb(أنا)){\displaystyle (i-\operatorname {lsb} (i))\mathbin {|} (2\cdot \operatorname {lsb} (i))}.

على سبيل المثال، أبناء العدد 6 = 110 2 هم 5 = 101 2 و 7 = 111 2 ، ووالده هو 4 = 100 2 .

على الرغم من أن هذه الشجرة قد تكون لانهائية، إلا أنه يمكننا تعريف جذرها بأنه أعلى عقدة موجودة ، ويكون فهرسها أكبر قوة للعدد 2 أقل من أو يساوين{\displaystyle n}.

من الممكن أن يكون للعقدة أب وهمي بفهرس أكبر منن{\displaystyle n}ومع ذلك، لا يزال للعقدة جدٌّ موجود. إذا انطبق المثال أعلاه على شجرة مكونة من 5 عقد، فإن العقدة 5 سيكون لها أبٌ وهمي 6، ولكن جدٌّ موجود 4.

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

مع ذلك، فإن عمليات التصفح التصاعدي في شجرة البحث غير شائعة؛ إذ يُستخدم بشكل أساسي لإجراء استعلامات الترتيب: عند إعطاء مجموع بادئة، ما هو فهرس ظهوره؟ ويتم ذلك من خلال تصفح تنازلي عبر شجرة البحث. أثناء التصفح، يتم الاحتفاظ بثلاثة متغيرات: فهرس العقدة الحالية، والترتيب المطلوب في الشجرة الفرعية المتفرعة من العقدة الحالية، و"فهرس احتياطي" يُعاد إذا كان الترتيب المطلوب أكبر من الترتيب الموجود في الشجرة الفرعية.

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

في كل خطوة، إما أن تكون العقدة الحالية عقدة وهمية (مؤشر أكبر منن{\displaystyle n}أو يجب أن نقرر ما إذا كان الموضع المطلوب يقع على يسار أو يمين نهاية العقدة الحالية. إذا كانت الرتبة المطلوبة أقل من قيمة مصفوفة فينويكF[أنا]{\displaystyle F[i]}بالنسبة للعقدة الحالية، يجب البحث في شجرتها الفرعية اليسرى. إذا كانت أكبر، يتم البحث في شجرتها الفرعية اليمنى. أما إذا كانت مساوية، فيعتمد الاتجاه المختار على كيفية رغبتك في التعامل مع عمليات البحث عن المجاميع الواقعة تمامًا بين عقدتين.

ثم يتم تقسيم هذه الاحتمالات الثلاثة بشكل أكبر بناءً على ما إذا كانت العقدة الحالية ورقة أم لا:

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

الشفرة الزائفة

فيما يلي تطبيق بسيط باستخدام الشفرة الزائفة للعمليتين الرئيسيتين على شجرة فينويك - الاستعلام والتحديث:

الدالة query(tree, index) هي المجموع := 0 بينما يكون المؤشر أكبر من 0، نفّذ sum += tree[index] index -= lsb(index) إرجاع المجموع دالة التحديث (الشجرة، الفهرس، القيمة) تقوم بما يلي: طالما أن الفهرس < حجم الشجرة، نفّذ tree[index] += value index += lsb(index)

الوظيفةlsb(ن){\displaystyle {\text{lsb}}(n)}يحسب أقل بت مُفعّل ذي أهمية من البت المُعطىن{\displaystyle n}أو، بصورة مكافئة، أكبر قوة للعدد اثنين التي تُعد أيضًا قاسمًا لـن{\displaystyle n}. على سبيل المثال،lsb(20)=4{\displaystyle {\text{lsb}}(20)=4}كما هو موضح في تمثيله الثنائي:lsb(101٠٠2)=1002=4{\displaystyle {\text{lsb}}(10{\textbf {1}}00_{2})=100_{2}=4}يمكن تنفيذ هذه الوظيفة ببساطة في الكود من خلال عملية AND الثنائيةlsb(n) = n & (-n) ، بافتراض نفي المتمم الثنائي . [ 3 ]

بناء

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

الدالة construct(values) هي tree := values لكل فهرس من 1 إلى حجم(الشجرة) نفّذ parentIndex := index + lsb(index) إذا كان parentIndex < size(tree) tree[parentIndex] += tree[index] شجرة العودة

انظر أيضاً

مراجع

  1. بوريس ريابكو (1989). "برنامج سريع عبر الإنترنت" (ملف PDF) . مجلة الرياضيات السوفيتية . 39 (3): 533-537 . مؤرشف (ملف PDF) من الأصل بتاريخ 17 يوليو 2019. تم الاطلاع عليه بتاريخ 17 يوليو 2019 .
  2. بوريس ريابكو (1992). "رمز تكيفي سريع عبر الإنترنت" (ملف PDF) . معاملات IEEE في نظرية المعلومات . 28 (1): 1400-1404 . مؤرشف (ملف PDF) من الأصل بتاريخ 14 يوليو 2019. تم الاطلاع عليه بتاريخ 14 يوليو 2019 .
  3. 1 2 بيتر م. فينويك (1994). "بنية بيانات جديدة لجداول التكرار التراكمي". البرمجيات: الممارسة والخبرة . 24 (3): 327-336 . CiteSeerX 10.1.1.14.8917 . doi : 10.1002/spe.4380240306 . S2CID 7519761 .  
  4. مارشيني، ستيفانو؛ فيجنا، سيباستيانو (14 أكتوبر 2019). "أشجار فينويك المدمجة للتصنيف والاختيار الديناميكي". arXiv : 1904.12370 [ cs.DS ]. مناقشة مستفيضة لتفاصيل التنفيذ العملي.
  5. كنوت، دونالد (2011). الخوارزميات التوافقية، الجزء 1. فن برمجة الحاسوب . المجلد 4أ. أبر سادل ريفر، نيوجيرسي: أديسون-ويسلي بروفيشنال. الصفحات 164-165 .  
  6. ^ حليم، ستيفن. حليم، فيليكس؛ أفندي ، سوهندري (3 ديسمبر 2018). البرمجة التنافسية 4 . المجلد. 1. مطبعة اللولو، إنكوربوريتد. رقم ISBN  978-1-716-74552-2.