بحث اثناني

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

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

ثمة تطبيقات متنوعة للبحث الاثناني: يسرّع التتالي الجزئي عمليات البحث الاثنانية عن قيمة واحدة في مصفوفات متعددة. وهو قادر على حل عدد من مشكلات البحث في الهندسة الحسابية وفي العديد من المجالات الأخرى بكفاءة عالية. يوسع البحثُ الأسّي البحثَ الاثناني ليشمل القوائم غير المحدودة، وتعتمد بنى بيانات شجرة البحث الاثنانية والشجرة الاثنانية على البحث الاثناني أيضاً.

## التسمية
يُسمَّى البحث الاثناني أيضًا بالعربية: **البحث الثنائي** أو **خوارزمية البحث الثنائي**  أو **البحث بالتنصيف** ، ومن أسمائه المترجمة من الإنجليزية: **البحث المُحدَّد بفاصل المنتصف**، و**البحث اللغارتمي**، و**القطع الاثناني**.

## خوارزمية العمل

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

#### الإجرائية الرئيسة
إذا كانت A مصفوفةً تحتوي على n عنصر أو سجل هي: A_0,A_1,A_2,\ldots,A_{n-1} مرتبة بالشكل التالي: A_0 \leq A_1 \leq A_2 \leq \cdots \leq A_{n-1}، وإذا كانت القيمة المُستهدَفة هي T، فبالإمكان العثور على مرتبة القيمة المستهدفة T في المصفوفة A، أي إنجاز بحثٍ اثناني، باستخدم الخوارزمية التالية:

تتبع هذه الإجرائية التكرارية حدود البحث باستخدام المتغيرين L وR اللّذين يُمثِّلان دائماً الحدين الأسفل والأعلى على الترتيب لجزء المصفوفة الذي تُطبَّق خوارزمية البحث الاثناني عليه. يمكن أيضاً التعبير عن الخوارزمية السابقة بشبه الرماز التالي، وفيه تبقى أسماء المتغيرات وأنواعها كما هي أعلاه، ويُمثِّل `floor` دالة أرضية، وتشير الكلمة `unsuccessful` إلى قيمة رقمية محددة تُعبِّر عن إخفاق البحث.

 **function** binary_search(A, n, T) **is**
     L := 0
     R := n − 1
     **while** L ≤ R **do**
         m := floor((L + R) / 2)
         **if** A[m]  T **then**
             R := m - 1
         **else**:
             **return** m
     **return** unsuccessful


يمكن أيضاً أن تُستبدل الدالة السقفية `ceil` بالدالة الأرضية المستخدمة على القيمة \frac{L+R}{2}. ولكن هذا قد يؤدي إلى إعطاء نتيجة مُغايرة إذا وجدت القيمة المُستهدَفة أكثر من مرة في المصفوفة.

#### إجرائية بديلة
ينجح البحث في الإجرائية الرئيسة إذا كانت قيمة العنصر المتوسط m تساوي القيمة المُستهدَفة (T) في كل تكرار. تتخلى بعض تنفيذات الخوارزمية عن إجراء هذا الفحص أثناء كل تكرار، ولا تنفّذه إلا عند بقاء عنصر واحد فقط، أي عندما يكون L=R. ينتج عن هذا التغيير حلقة مقارنة أسرع بسبب استبعاد إجراء عملية المقارنة مرةً واحدةً عند كل تكرار. ولكن هذه الطريقة تتطلب إجراء تكرارٍ إضافي واحد في المتوسط.

نشر هيرمان بوتينبروش أول تنفيذ للخوارزمية يتخلى عن إجرائية فحص المساواة بالشكل السابق في عام 1962م.

يمكن أيضاً التعبير عن الخوارزمية السابقة بشبه الرماز التالي:

     **function** binary_search_alternative(A, n, T) **is**
     L := 0
     R := n − 1
     **while** L != R **do**
         m := ceil((L + R) / 2)
         **if** A[m] > T **then**
             R := m - 1
         **else**:
             L := m
     **if** A[L] = T **then**
         **return** L
     **return** unsuccessful


### التعامل مع العناصر المكررة
قد تُرجِع الإجرائية  مرتبة أي عنصر تكون قيمته مساويةً للقيمة المستهدفة، حتى ولو كان هناك عناصر مُكرَرة في المصفوفة. على سبيل المثال، إذا كانت المصفوفة التي يُراد البحث فيها هي: [1,2,3,4,4,5,6,7] وكانت القيمة المستهدفة هي 4، فإن الخوارزمية سُترجع العنصر الرابع، أي الذي تكون قيمة مرتبته 3، والخامس، أي الذي تكون قيمة مرتبته 4. ستعيد إجرائية الرئيسة العنصر الرابع فقط في هذه الحالة. في بعض الأحيان، يكون من الضروري العثور على موقع العنصر الموجود في أقصى اليسار أو العنصر الموجود في أقصى اليمين ضمن مجموعة العناصر المكررة في المصفوفة. في المثال أعلاه، ومن أجل العناصر المكررة التي تكون قيمتها 4، فإنَّ العنصر الرابع هو العنصر الموجود في أقصى اليسار، في حين أن العنصر الخامس هو العنصر الموجود في أقصى اليمين. في الإجرائية البديلة، إذا وجدت مجموعة من العناصر المكررة، فإن مرتبة العنصر الموجود في أقصى اليمين سيعاد دائماً.

#### إجرائية لإرجاع العنصر الموجود في أقصى اليسار
إذا كانت المصفوفة المُرتبة تحتوي على مجموعة من العناصر مكررة عددها n، يمكن استعمال الخوارزمية التالية لإرجاع العنصر الموجود في أقصى يسار مجموعة العناصر المرتبة:

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

يمكن أيضاً التعبير عن الخوارزمية السابقة بشبه الرماز التالي:

 **function** binary_search_leftmost(A, n, T):
     L := 0
     R := n
     **while** L 

#### إجرائية لإرجاع العنصر الموجود في أقصى اليمين
إذا كانت المصفوفة المُرتبة تحتوي على مجموعة متكررة من العناصر عددها n، يمكن استعمال الخوارزمية التالية لإرجاع العنصر الموجود في أقصى يمين مجموعة العناصر المرتبة:

إذا كانت المتراجحة L > 0 والشرط A_{L-1}=T مُتحققان، فإن A_{L-1} هو العنصر الموجود في أقصى يمين مجموعة العناصر التي تساوي قيمة كل منها القيمة المستهدفة T. حتى وإن كانت القيمة المستهدفة غير موجودة في المصفوفة، فإن قيمة n-L، الناتجة عن تنفيذ الإجرائية، ستمثِّل عدد عناصر المصفوفة التي كانت ستوجد بعد العنصر المُحدد بالقيمة المستهدفة، لو وُجِدَ.

يمكن أيضاً التعبير عن الخوارزمية السابقة ببشبه الرماز التالي:

 **function** binary_search_rightmost(A, n, T):
     L := 0
     R := n
     **while** L  T:
             R := m
         **else**:
             L := m + 1
     **return** R - 1


### تطابقات تقريبية
تصغير|300 بك| يمكن تكييف البحث الاثناني لحساب التطابقات التقريبية. في المثال أعلاه، تعرض المرتبتان السابقة واللاحقة وأقرب جار للقيمة المستهدفة <math>5</math>، وهي قيمة غير موجودة في المصفوفة.
تبحث الإجرائيات السابقة عن التطابقات التامة بين القيمة المستهدفة وعناصر المصفوفة المُرَتَّبة، ثُمَّ تعيد موضع العنصر المتطابق في المصفوفة. وعلى أي حال، يمكن توسيع البحث الاثناني ليشمل البحث عن تطابقات تقريبية اعتماداً على فكرة أن البحث الاثناني يعمل على المصفوفات المُرتبة. على سبيل المثال، من أجل قيمة مستهدفة ما غير موجودة في المصفوفة، يُمكن استخدام البحث الاثناني لحساب مرتبة القيمة، أي عدد عناصر المصفوفة ذوات القيم الأصغر منها، والمرتبة السابقة لها، أي مرتبة العنصر السابق الأصغر، والمرتبة اللاحقة لها، أي مرتبة العنصر التالي الأكبر، والجار الأقرب لها. يمكن أيضاً الاستعلام عن مجالٍ ما أي البحث عن عدد العناصر الموجودة بين قيمتين في المصفوفة باستخدام الاستعلامات سابقة الذكر.

يمكن أيضاً تنفيذ استعلامات عن المرتبة بالإجرائية الخاصة بالعثور على العنصر الموجود في أقصى اليسار، حيث يُرجع عدد العناصر التي تكون قيمتها أقل من القيمة المستهدفة. ويمكن تنفيذ استعلامات عن المرتبة السابقة باستخدام الاستعلامات عن المرتبة، فإذا كانت مرتبة القيمة المستهدَفة r، فإن مرتبة القيمة السابقة هي r-1. أما فيما يخص استعلامات مرتبة القيمة اللاحقة، فبالإمكان استخدام الإجرائية المُخصصة للعثور على العنصر الموجود في أقصى اليمين لأجل ذلك، فإذا كانت نتيجة مرتبة القيمة المستهدفة هي *<math>r</math>*، فإن مرتبة القيمة اللاحقة لها هي &nbsp;r+1. يُحدد الجار الأقرب للقيمة المستهدفة بالنظر إلى المرتبتين السابقة واللاحقة لها، واختيار أقرب منهما. تٌنفَّذ الاستعلامات عن النطاق حسبَ ما يأتي: قي البداية تُحدد مرتبتي القيمتين، ثُمَّ يُحسَب عدد العناصر ذات القيمة المساوية أو الأكبر من الأولى والأقل من القيمة الثانية بإيجاد الفرق بين المرتبتين. يمكن تعديل هذا العدد نحو القيمة الصحيحة التالية أو السابقة، أي التي تنقص أو تزيد بمقدار واحد، حسبَ طريقة تحديد بداية ونهاية النطاق، أي هل نقطة البداية ونقطة النهاية جزءٌ من النطاق أم لا، وهل تحتوي المصفوفة على عناصر تتطابق قيمتها مع نقاط النهاية أم لا.

## تقييم الأداء
[تصغير|300 بك|شجرة اثنانية تُمثِّل عملية البحث الاثناني. المصفوفة التي يطبق الإجراء عليها هي <math>[20, 30, 40, 50, 80, 90, 100]</math>، والقيمة المستهدفة هي <math>40</math>.](https://ar.wikipedia.org/wiki/%D9%85%D9%84%D9%81:Binary_search_example_tree.svg)
تصغير|300 بك|تكون الحالة الأسوأ عندما يصل البحث إلى أعمق مستوى في الشجرة الاثنانية، أما الحالة الفضلى فتحصل عندما تكون القيمة المستهدفة هي العنصر المتوسط في المصفوفة.
يمكن تحليل أداء البحث الاثناني باستعرض سير الإجراء على شجرة اثنانية ومراقبة عدد المقارنات. تكون العقدة الجذر في الشجرة هي العنصر المتوسط في المصفوفة. بعد ذلك، يكون العنصر المتوسط في النصف الأسفل من المصفوفة هو العقدة الفرعية اليسرى للجذر، والعنصر المتوسط في النصف الأعلى من المصفوفة هو العقدة الفرعية اليمنى للجذر. ثمَّ يُبنى ما تبقى من الشجرة الاثنانية باتباع نفس الطريقة. عند تطبيق الإجراء، يبدَأ البحث من العقدة الجذر، وتكون هي العقدة المنظورة، وتقارن قيمتها مع القيمة المُستهدفة، فإذا كانت القيمة المُستهدَفة أكبر من قيمة العقدة المنظورة تصبح العقدة المنظورة التالية هي العقدة الفرعية اليمنى للجذر، وإذا كانت القيمة المُستهدفة أصغر من قيمة العقدة المنظورة فإن العقدة المنظورة التالية تصبح العقدة الفرعية اليسرى للجذر، وتكرر عملية المقالة والتحرك على فروع الشجرة الاثنانية نحو اليمين أو اليسار حسبَ ما سبق، حتى تكون القيمة المُستهدفة مساوية للقيمة المنظورة، وعندها البحث يتوقف بنجاح.

يكرر البحث الاثناني حلقة المقارنة \lfloor \log_2 (n) + 1 \rfloor مرَّة في أسوأ حالة، وفيها \lfloor \rfloor هو تمثيل الدالة الأرضية، وتعطي أكبر عدد صحيح يكون أصغر أو مساوٍ للقيمة التي تمرر لها، أي إذا مررنا 2.5 مثلاً، فإنها ستعيد القيمة 2. أمَّا \log_2 فهي دالة اللغارتم الاثناني. ويعني الوصول إلى الحالة الأكثر سوءاً بلوغ أعمق مستوى للشجرة. في شجرة بحث اثناني عدد عناصرها n هناك دائماً \lfloor \log_2 (n) + 1 \rfloor مستوىً. ويمكن أيضاً الوصول إلى الحالة الأكثر سوءاً عندما تكون القيمة المستهدفة غير موجودة في المصفوفة.

يُحسب متوسط عدد مرات تكرار إجراء البحث الاثناني مع افتراض البحث عن كل عنصر موجود في المصفوفة بالعلاقة التالية:

ويساوي تقريباً \log_2(n) - 1 تكرارًا.

إذا لم تكن القيمة المستهدفة في المصفوفة، فإن عدد مرات تكرار الإجراء يُحسب وسطياً بالعلاقة:

وذلك على افتراض البحث عن كل عنصر موجود في المصفوفة.

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

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

### تعقيد الفضاء
يتطلب البحث الاثناني استعمال ثلاثة مؤشرات للعناصر، قد تكون فهارس للمصفوفة أو مؤشرات لمواقع الذاكرة، وذلك بغض النظر عن حجم المصفوفة. ويتطلب أيضًا \left \lceil \log_2(n) \right \rceil بتًا على الأقل من أجل ترميز مؤشرٍ إلى عنصر ما في مصفوفة تحتوي n عنصراً، ويحتاج أيضاً O(n) من مساحة التخزين من أجل المصفوفة السابقة نفسه. لذلك، فإن تعقيد فضاء البحث الاثناني O(\log n).

### اشتقاق الحالة المتوسطة
يعتمد متوسط عدد التكرارات التي يُنجزها البحث الاثناني على احتمال وجود كل عنصر يجري البحث عنه. تختلف الحالة المتوسطة لعمليات البحث الناجحة عن تلك المرتبطة بعمليات البحث غير الناجحة. تُعرَّف الحالة المتوسطة لعمليات البحث الناجحة بأنها عدد التكرارات المطلوبة للبحث في كل عنصر في المصفوفة مرة واحدة بالضبط، مقسومةً على عدد العناصر n فيها. أما الحالة المتوسطة لعمليات البحث غير الناجحة فهي عدد التكرارات المطلوبة للبحث عن عنصر ما في كل المجالات الفاصلة مرة واحدة بالضبط، مَقسُوماً على عدد الفواصل، أي n + 1.

فيما يأتي، من أجل عمليات البحث الناجحة، سيُفترض أن البحث الاثناني يحصل بصورة متكافئة عن كل عنصر في المصفوفة، أمَّا من أجل عمليات البحث غير الناجحة، فسيُفترض أن البحث الاثناني يحصل بصورة متكافئة على الفواصل بين العناصر غير الموجودة في المصفوفة وعلى الفواصل بين العناصر غير الموجودة وتلك الموجودة في المصفوفة.

#### عمليات البحث الناجحة
يمكن عرض بحث اثناني ناجح في شجرة اثنانية على شكل مسار يبدأ من الجذر وينتهي عند العقدة المستهدَفة، ويُمثَّل البحث عندها بالمسار الداخلي نحو ذلك العنصر، ويكون طوله مساوياً لعدد الوصلات التي يمر بها المسار. أما طول المسار الداخل في المصفوفة فهو مجموع أطوال جميع المسارات الداخلية نحو العناصر الفريدة. أمَّا فيما يخص عدد التكرارات التي ينجزها بحث ما، فإذا كان طول المسار الداخلي لعنصر ما هو l وصلة، فإن عدد التكرارات المنجزة لبلوغه يكون l + 1 وشاملاً التكرار الأول. إذا كان هناك n عنصراً، وهو عدد صحيح موجب، وكان طول المسارات الداخلية هو I(n)، فإن متوسط عدد التكرارات لعملية بحث ناجحة هو T(n) = 1 + \frac{I(n)}{n}، وقد أضيف واحد لجعل العلاقة تشمل التكرار الأول.

بما أن خوارزمية البحث الاثناني هي الخوارزمية المثلى لعمليات البحث مع مقارنة، فإن بالإمكان اختزال هذه المسالة لحساب الطول الأصغر للمسار الداخلي في الأشجار الاثنانية  التي تضم n عقدة، أي إلى I(n)، وهو يُحسب باستعمال العلاقة:

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

أمَّا متوسط عدد التكرارات فيمكن أن يحسب وفق معادلة الحالة المتوسطة وتكون قيمته: 1 + \frac{10}{7} = 2 \frac{3}{7}.

ويمكن أيضاً تبسيط طول المسارات الداخلية I(n) أيضاً وفق ما يأتي:

وإذا عُوِّضت القيمة السابقة لطول المسارات الداخلية في معادلة حساب متوسط عدد التكرارات لعملية بحث ناجحة، أي I(n)، فإنها تؤول إلى الشكل التالي:



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

#### عمليات البحث غير الناجحة
يمكن تمثيل عمليات البحث غير الناجحة من خلال توسيع الشجرة عن طريق إضافة عقد خارجية إليها، لتنتج شجرة اثنانية مُوسَّعة. إذا كان لدى عقدة داخلية ما، أي لدى عقدة موجودة في الشجرة، أقل من عقدتين فرعيتين، فتضاف عقدٌ فرعيةٌ خارجيةٌ لها، بحيث يكون لكل عقدة داخلية ابنان اثنان. بعد ذلك، يمكن تمثيل البحث الاثناني غير الناجح على شكل مسار إلى عقدة خارجية، يكون والدها هو العنصر الوحيد الذي بقي في أثناء التكرار الأخير.

يُعرَّف المسار الخارجي بأنه مسارٌ يبدأ من الجذر وينتهي في عقدة خارجية، وطول المسار الخارجي نحو عنصر ما بأنه عدد الوصلات فيه، وطول المسار الخارجي هو مجموع أطوال المسارات الخارجية نحو عناصر المصفوفة جميعها.

إذا وُجِد n عنصر في المصفوفة، وهو عدد صحيح موجب، وإذا كان طول المسار الخارجي هو E(n)، فإنَّ متوسط عدد التكرارات لعملية بحث غير ناجح يحسب بالعلاقة التالية:

قُسِّم طول المسار الخارجي على n+1 بدلًا من n لأن هناك n+1 مساراً خارجياً، يمثل الفواصل بين عناصر المصفوفة نفسهم وبين عناصر المصفوفة والعناصر الخارجية.

وبنفس الطريقة المتبعة مع عمليات البحث الناجحة، يمكن اختزال هذه المسألة لتحديد الطول الأدنى للمسار الخارجي لجميع الأشجار الاثنانية من أجل n عقدة وهو يساوي طول المسار الداخلي مضافاً له 2n. وبتعويض ذلك في المعادلة المستخدمة لحساب طول المسارات الداخلية I(n) تنتج المعادلة التالية لحساب طول المسار الخارجي:



بتعويض القيمة الناتجة لطول المسار الخارجي E(n) في معادلة حساب متوسط عدد التكرارات لعملية بحث غير ناجح T'(n)، يمكن الحصول على المعادلة التالية:

{(n+1)} = \lfloor \log_2 (n) \rfloor + 2 - 2^{\lfloor \log_2 (n) \rfloor + 1}/(n + 1)}}

### تقييم أداء الإجراء البديل
يؤدي كل تكرار لإجراء البحث الاثناني الموصوف في الأعلى إلى مقارنة واحدة أو مقارنتين اثنتين للتحقق فيما إذا كان العنصر المتوسط يساوي القيمة المستهدفة. على افتراض أن عملية البحث عن العناصر جميعها تحصل بصورة متكافئة، فإن كل تكرار سيؤدي إلى 1.5 مقارنة وسطياً.

ثمة شكل من أشكال خوارزمية البحث الاثناني يتحقق فيما إذا كان العنصر المتوسط يساوي الهدف في نهاية البحث فقط. وسطياً، يلغي هذا الشكل نصف مقارنة من كل تكرار. يؤدي هذا إلى تقليل الوقت المستغرق في التكرار بشكل طفيف على معظم أجهزة الحاسوب. وتضمن هذه الخوارزمية مع ذلك أن يُنجز البحث بالعدد الأقصى من التكرارات. يضاف تكرارٌ واحد وسطياً إلى البحث، بسبب تنفيذ حلقة المقارنة \lfloor \log_2 (n) + 1 \rfloor مرة فقط في أسوأ الحالات. إن الزيادة الطفيفة في قيمة الكفاءة من أجل كل تكرار لا تعوّض التكرار الفائض الإجمالي في كل الحالات، بل فقط عندما يكون عدد العناصر n كبيراً جداً.

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

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

## مقارنة مع طرق بحث أخرى
إن استعمال المصفوفات المرتبة مع البحث اثناني حلٌ غير فعال عندما تكون عمليات الإدراج والحذف في المصفوفة متداخلة مع الاسترجاع، ويستغرق ذلك زمناً هو O(n) لكل عملية من هذا القبيل. بالإضافة إلى ذلك، يمكن أن تؤدي المصفوفات التي المُرتَّبة إلى تعقيد استخدام الذاكرة خاصة عندما تحصل عملية إدراج العناصر في المصفوفة بشكل متكرر. ثمة بنى بيانات أخرى تدعم الإدراج والحذف بشكل أكثر كفاءة.

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

### بحث خطي

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

### الأشجار

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

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

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

### التلبيد

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

### خوارزميات تعيين العضوية
خوارزميات تعيين العضوية مرتبطة بعملية البحث، ويمكن استخدام أي خوارزمية بحث، مثل البحث الاثناني، من أجل تعيين العضوية أيضاً. ثمة خوارزميات أخرى أكثر ملاءمة للعضوية المُحدَّدة، فمصفوفة البت مثلاً هي الأبسط والأكثر إفادة عندما يكون نطاق المفاتيح محدوداً، وهي تُخزِّن مجموعة من البتات المضغوطة التي يُمثِّل كل منها مفتاحاً واحداً في نطاق المفاتيح. هذه المصفوفات سريعة للغاية أيضاً، وتتطلب زمناً هو O(1) فقط. يعالج النوع الأول من مصفوفة جودي مفاتيح بطول 64 بت بكفاءة.

تُخزِّن مرشحات بلوم، وهي بنية بيانات احتمالية أخرى تستند إلى التلبيد مجموعة من المفاتيح عن طريق ترميزها باستخدام مصفوفة بت ودوال تلبيد متعددة للحصول على نتائج تقريبية. مُرشِّحات بلوم أكثر فعالية بالنسبة لمساحة التخزين مقارنة مع مصفوفات البت في معظم الحالات وليست أبطأ منها بكثير: حيث يستغرق إنجاز k دالة تجزئة من أجل استعلامات العضوية زمناً هو O(k) فقط. ولكن مُرشِّحات بلوم تعاني من الأخطاء الإيجابية.

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

## اختلافات

### البحث الاثناني المنتظم
300بك|تصغير|يُخزِّن البحث الاثناني الموحَّد الفرق بين العنصر الحالي والعنصرين المتوسطين المحتملين التاليين بدلاً من الحدود المحددة.
يُخزِّن البحث الاثناني المنتظم الفرق بين فهرسي العنصر المتوسط في تكرارين متتابعين، بدلاً من الحدين الأسفل والأعلى، ويُحسب مسبقاً جدول بحث يضم هذه الفروق سلفاً. على سبيل المثال، إذا كانت المصفوفة المراد البحث فيها هي: ، فإن العنصر المتوسط (m) سيكون . في هذه الحالة، يكون العنصر المتوسط من المصفوفة الفرعية اليسرى () هو 3 والعنصر المتوسط من المصفوفة الفرعية اليمنى () هو . سيُخزِّن البحث الاثناني المنتظم القيمة 3 حيث يبتعد كلا المؤشرين عن 6 بنفس المقدار. لتقليل فضاء البحث، تضيف الخوارزمية التغيير السابق أو تطرحه من فهرس العنصر المتوسط. قد يكون البحث الاثناني الموحَّد أسرع في الأنظمة التي يكون حساب نقطة المنتصف غير فعالٍ، مثل أجهزة الحاسوب العشرية.

### البحث الأسي
تصغير|300 بك|يصور البحث الأسي إيجاد الحد الأعلى للبحث الاثناني اللاحق.
يوسِّع البحثُ الأسي البحثَ الاثناني ليشمل القوائم غير المحدودة. يبدأ البحث الأسي بالعثور على أول عنصر يكون مُؤَشِّره من مضاعفات العدد 2 وأكبر من القيمة المستهدفة. بعد ذلك، يُضبط هذا الفهرس ليكون حداً أعلى، ثمَّ يُطبَّق البحث الاثناني. يستغرق البحث \lfloor \log_2 x + 1\rfloor تكراراً قبل بدء البحث الاثناني و\lfloor \log_2 x \rfloor تكراراً على الأكثر بعد بدء البحث الاثناني، حيث x هو فهرس القيمة المستهدفة. يعمل البحث الأسي على القوائم المقيدة أيضاً، ولكنه يصبح تحسيناً للبحث الاثناني فقط في الحالة التي تكون فيها القيمة المستهدفة قريبة من بداية المصفوفة.

### البحث بالتقدير
تصغير|300 بك|شرح مصور لكيفية إنجاز بحث بالتقدير باستخدام البحث الخطي. في هذه الحالة، لا حاجة للبحث لأن تقدير موقع الهدف داخل المصفوفة صحيح. قد تحدد تطبيقات أخرى طرقاً متنوعة لتقدير موقع الهدف.
يُقدِّر البحث  موضع القيمة المستهدفة بالتخمين بدلاً من حساب نقطة المنتصف، مع مراعاة العنصرين الموجودين في الموقعين الأدنى والأعلى في المصفوفة بالإضافة إلى عدد العناصر فيها. يعمل البحث بالتقدير اعتماداً فكرة أن نقطة المنتصف ليست التخمين الأمثل في كثير من الحالات. على سبيل المثال، إذا كانت القيمة المستهدفة قريبة من قيمة العنصر ذي الفهرس الأعلى في المصفوفة، فمن المحتمل أن تكون موجودة بالقرب من نهاية المصفوفة.

يمكن إنجاز البحث الخطي بالبحث بالتقدير. إذا كانت A مصفوفة حدها الأعلى هو R وحدها الأدنى L، وكانت القيمة المُستهدفة هي T، فبالإمكان تقدير موقع الهدف حسب العلاقة:(T - A_L) / (A_R - A_L) وهي حتماً قيمة تقع بين L وR. إذا وزعت عناصر المصفوفة عند استخدام البحث الخطي توزيعًا منتظمًا أو شبه منتظم، فإن البحث البحث بالتقدير يحتاج إلى O(\log \log n) مقارنة.

يكون البحث بالتقدير أبطأ عملياً من البحث الاثناني في المصفوفات الصغيرة، لأنه يتطلب إجراء حسابات إضافية. ينمو تعقيد الوقت في البحث بالتقدير بشكل أبطأ من نموه البحث الاثناني، ولكنه لا يكفي ليعوض الزمن اللازم لإجراء الحسابات الإضافية ما لم تكن المصفوفة كثيرة العناصر.

### التتالي الجزئي
تصغير|300 بك|في التتالي الجزئي، لدى كل مصفوفة مؤشرات لكل عنصر ثانٍ في مصفوفة أخرى، وبذلك يمكن إجراء البحث الاثناني مرة واحدة فقط للبحث في المصفوفات جميعها.

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

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

### التعميم على البيانات

يُعمم البحث الاثناني ليسعمل من أنواع محددة من البيانات. أشجار البحث الاثنانية هي إحدى هذه التعميمات، فعندما يُستعلم عن عقدة ما في الشجرة، تُحدِّد الخوارزمية العقدة حيث توجد القيمة المُستهدَفة، أو الشجرة الفرعية حيث توجد تلك العقدة. ويمكن أيضاً تعميم ما سبق على نحو أشمل كما سيأتي: من أجل بيان غير موجَّهٍ ذي وزن إيجابي وعقدة ما مُستهدَفة فيه، فإنَّ استعلام الخوارزمية لعقدة ما في البيان، إما أن يكشَف عن كونها مساوية للقيمة المُستهدَفة، أو يُحدد الوصلة التي تقود إلى أقصر مسار يصل بين العقدة المُستعلَمة والعقدة المُستهدفة. خوارزمية البحث الاثناني القياسية حالة بسيطة لبيان  وحيد المسار. بالمثل، فإن أشجار البحث الاثناني هي الحالة التي تكون نتيجة استعلام عقدة لا تساوي قيمتها القيمة المُستهدفة هي شجرةٌ فرعية تقع إلى يمين العقدة المُستعملة أو إلى يسارها. أما فيما يخص البيانات غير غير الموجَّهة ذات الأوزان الإيجابية، فثمة خوارزمية تُوجِد العقدة المُستهدَفة بعد O(\log n) استعلام في أسوأ الحالات.

### البحث الاثناني الضجيجي
تصغير|300 بك|ثمة احتمال معين بأن المقارنة غير صحيحة في البحث الاثناني الضجيجي.
تقدم خوارزميات البحث الاثناني الضجيجية حلاً في الحالات التي لا يمكن فيها مقارنة عناصر المصفوفة بشكل موثوق. في هذه الحالات، ومن أجل كل زوج من العناصر، ثمةاحتمال أن تنجز الخوارزمية مقارنة خاطئة. يمكن للبحث الاثناني الضجيجي أن يجد الموقع الصحيح للقيمة المُستهدَفة مع احتمال معين يتحكم في الموثوقية. يلزم أن تنجر كل إجرائية بحث اثناني ضجيجي عددًا من المقارنات يبلغ (1 - \tau)\frac{\log_2 (n)}{H(p)} - \frac{10}{H(p)} مقارنة في المتوسط على الأقل، حيث H(p) = -p \log_2 (p) - (1 - p) \log_2 (1 - p) هي دالة التحول الاثناني و\tau هو احتمالية أن يعيد الإجراء موقعاً خاطئاً.

البحث الاثناني الضجيجي حالة من لعبة ريناي وأولام، وهي نوع متفرع من لعبة الأسئلة العشرين التي يُحتمل أن تكون الإجابات خاطئة فيها.

### البحث الاثناني الكمي
تُحدُّ أجهزة الحاسوب التقليدية بالحالة الأكثر سوءاً التي تُنفِّذ \lfloor \log_2 n + 1 \rfloor تكراراً عند إجراء البحث الاثناني. لا تزال خوارزميات البحث الاثناني الكَميّ محدودة بالنسبة \log_2 n من أجل الاستعلامات، وه تمثل عدد التكرارات في الإجراء التقليدي، ولكن العامل الثابت ذو قيمة أقل من واحد، ما يؤمِّن تعقيداً زمنياً أقل في أجهزة الحواسيب الكمية.

يتطلب إجراء أي بحث اثناني كمي دقيق، أي إجراء يعيد نتيجة صحيحة دائماً، تنفيذ \frac{1}{\pi}(\ln n - 1) \approx 0.22 \log_2 n استعلام على الأقل في الحالات الأكثر سوءاً، حيث \frac{1}{\pi}(\ln n - 1) \approx 0.22 \log_2 n هو اللغارتم الطبيعي. ثمة إجراء لبحث اثناني كمي دقيق يُنفِّذ 4 \log_{605} n \approx 0.433 \log_2 n استعلاماً في أسوأ الحالات. لغرض المقارنة، فإنَّ خوارزمية غروفر، وهي الخوارزمية الكمية المثلى للبحث في قائمة غير مرتبة من العناصر، تتطلب O(\sqrt{n}) استعلاماً.

## نبذة تاريخية
تعود جذور فكرة فرز قائمة من العناصر للسماح بالبحث فيها بسرعة أكبر إلى العصور القديمة، وأقدم مثال معروف عن ذلك هو لوح إناكيبيت آنو من بابل الذي يعود إلى حوالي عام 200 قبل الميلاد. احتوى هذا اللوح حوالي 500 رقماً مكتوباً بنظام العد الستيني ومقابلاتها مرتبةً معجمياً، ما يُسهل البحث عن البنود. بالإضافة إلى ذلك، عُثر على العديد من قوائم الأسماء المرتبة حسب حرفها الأول في جزر بحر إيجة. وهناك أيضاً الكاثُولِيكون، وهو قاموس لاتيني أنجز عام 1286م، وكان أول عمل يصف قواعد ترتيب الكلمات أبجدياً، على عكس الأسلوب السابق الذي كان يعتمد على ترتيب الأحرف الأولى فقط.

أشار جون ماكلي في عام 1946م للمرة الأولى إلى البحث الاثناني ضمن مجموعة محاضرات في مدرسة مور. في عام 1957م، نشر ويليام ويزلي بيترسون الطريقة الأولى للبحث بالتقدير. عملت كل خوارزميات البحث الاثناني المنشورة حتى عام 1960م على المصفوفات التي يكون طولها من مضاعفات العدد 2...، بعد ذلك نشر ديريك هنري ليمر خوارزمية بحث اثناني عملت على المصفوفات أيًا كان طولها. في عام 1962م، قدم هيرمان بوتينبروش تنفيذًا بلغة "ألغول 60" لعملية البحث الاثناني تضمن إجراء المقارنة للتحقق من مساواة العنصر للقيمة المُستهدفة في نهاية البحث، وسبّب هذا زيادةً في متوسط عدد التكرارات بمقدار واحد، ولكنه قلّل من عدد المقارنات لكل تكرار. طوّر شاندرا من جامعة ستانفورد البحث الاثناني المنتظم عام 1971م. قدّم برنارد شازيل وليونيداس جويباس في عام 1986م التتابعيَ الجزئي طريقةً لحل العديد من مُشكلات البحث في الهندسة الحسابية.

## مشكلات التنفيذ

عندما قدّم جون بنتلي البحث الاثناني على شكل مسألةً في دورة للمبرمجين المحترفين، وجد أن 90% منهم أخفقوا في حلها حلًا صحيحًا بعد ساعات عديدة من العمل، ويرجع ذلك أساساً إلى التنفيذ غير السليم للخوارزمية والذي يُنتج مشكلة عند التشغيل أو يُرجع قيماً خاطئة في حالات اختبار حدية نادرة. تظهر دراسة نُشرت عام 1988م وشملت عشرين كتاباً عن البرمجة أن النص البرمجي المصدري الدقيق لعملية البحث الاثناني موجود فقط في خمسة منها. بالإضافة إلى ذلك، فإن تنفيذ بنتلي الذاتي للبحث الاثناني، والذي نشره في كتابه الصادر عام 1986 بعنوان "جواهر البرمجة"، تضمَّن خطأ فيضٍ ظلَّ غير معروفٍ لأكثر من عشرين عاماً. وشمل تنفيذ مكتبة لغة البرمجة جافا الخاص بالبحث الاثناني خطأ الفيض نفسه لأكثر من تسع سنوات.

غالباً ما تكون المتغيرات المستخدمة لتمثيل المؤشرات ذات حجم ثابت في التنفيذ العملي للخوارزمية، وهذا قد يؤدي إلى حصول فيض حسابي عند التعامل مع المصفوفات ذات الأحجام بالغة الكبر. إذا حُسبت نقطة منتصف النطاق على أنها \frac{L+R}{2} فإن قيمة L+R قد تتجاوز نطاق الأعداد الصحيحة لنوع البيانات المستخدم لتخزين نقطة المنتصف، حتى لو كانت قيمتا L وR ضمن النطاق. إذا كانت قيمتا *<math>L</math>* و*<math>R</math>* غير سالبتين، يمكن تجنب ما سبق وحساب نقطة المنتصف بالعلاقة L+\frac{R-L}{2}.

قد تحدث حلقة لا نهائية إذا لم يُحدَّد شروط الخروج من الحلقة تحديدًا صحيحًا. عندما تتجاوز قيمةُ *<math>L</math>* قيمةَ *<math>R</math>*، يُخفِق البحث ويَلزم أن يُبلَّغ عن ذلك. يلزم أيضًا الخروج من الحلقة عند العثور على العنصر المُستهدَف، أمَّا في حالة التنفيذ الذي يُؤجَّل الفحص إلى النهاية، يلزم التحقق من نجاح البحث أو إخفاقه عند الانتهاء. وجد بنتلي أن معظم المبرمجين الذين نفذوا البحث الاثناني تنفيذًا غير صحيح ارتكبوا خطأ ما في تحديد شروط الخروج.

## الدعم في المكتبات المعيارية
تتضمن المكتبات المعيارية للعديد من لغات البرمجة إجرائيات بحث اثنانية، منها على سبيل المثال:

* توفِّر لغة سي الدالة `()bsearch` في مكتبتها المعيارية، وهي دلة تُنفَّذ اعتماداً على البحث الاثناني، مع أن المعيار الرسمي لا يتطلَّب ذلك.
* توفر مكتبة النماذج القياسية في سي++ الدوال `()binary_search` و`()lower_bound` و `()upper_bound` و`()equal_range`.
* توفِّر مكتبة لغة دي القياسية المُسمَّاة فوبوس، في الوحدة `std.range` نوع `SortedRange` (وهو يُرجع بواسطة الدوال `()sort` و`()assumeSorted`)، بالإضافة للدوال الأعضاء `()contains` و`()equaleRange` و`()equaleRange` و`()lowerBound` و`()trisect`، التي تستخدم أيضاً تقنيات البحث الاثناني افتراضياً مع النطاقات التي توفر وصولاً عشوائياً.
* توفر كوبول فعل `SEARCH ALL` لإجراء عمليات بحث اثناني على جداول كوبول المرتبة.

* تحتوي حزمة مكتبة غو القياسية للفرز على دوال البحث `Search` ، `SearchInts` ، `SearchFloat64s`، و`SearchStrings`، التي تُنفِّذ البحث الاثناني العام، وكذلك تطبيقات محددة للبحث في شرائح الأعداد الصحيحة وأرقام الفاصلة العشرية والسلاسل على التوالي.
* تقدِّم جافا مجموعة من الدوال الأعضاء التي تحمِّل الدالة `()binarySearch` الثابتة بشكل زائد في أصناف  و في حزمة `java.util` القياسية لإجراء عمليات البحث الاثناني على مصفوفات جافا وعلى القوائم `List`، على التوالي.

* تقدِّم مايكروسوفت دوت نت فريموورك إصدارات عامة ثابتة من خوارزمية البحث الاثناني في الأصناف الأساسية في مجموعتها. مثال على ذلك هو الدالة العضو `System.Array` `BinarySearch<T>(T[] array, T value)`.

* بالنسبة إلى سي-الكائنية، يوفر إطار العمل المُسمَّى ` NSArray -indexOfObject:inSortedRange:options:usingComparator:` دالةً عضو في ماك أو إس إكس 10.6+. يحتوي إطار عمل آبل فونديشين سي  الأساسي أيضاً على دالة ` ()CFArrayBSearchValues`.
* توفِّر بايثون وحدة `bisect`.
* يتضمن صنف المصفوفة في روبي دالة عضو اسمها `bsearch` تشمل على تطابق تقريبي.

## الهوامش

## ملحق: مسرد المصطلحات الإنجليزية

## انظر أيضًا

## المراجع
### فهرس الإحالات
;المنشورات
:بالعربية

:بالإنجليزية

;الوب
:بالإنجليزية

### ثبت المراجع
;المقالات المُحكَّمة

* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 

;الكتب
:بالعربية

* 
* 
* 

:بالإنجليزية

* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 

تصنيف:2 (عدد)
تصنيف:التثنية في المنطق
تصنيف:خوارزميات بحث