البحث الثنائي
تصور خوارزمية البحث الثنائي حيث 7 هي القيمة المستهدفة | |
| فصل | خوارزمية البحث |
|---|---|
| هيكل البيانات | مصفوفة |
| الأداء في أسوأ الأحوال | O (سجل n ) |
| أفضل أداء في الحالة | ا (1) |
| الأداء المتوسط | O (سجل n ) |
| أسوأ حالة تعقيد الفضاء | ا (1) |
| أفضل | نعم |
في علوم الكمبيوتر ، البحث الثنائي ، المعروف أيضًا باسم البحث بنصف الفاصل الزمني ، [1] أو البحث اللوغاريتمي ، [2] أو التقطيع الثنائي ، [3] هو خوارزمية بحث تجد موضع قيمة مستهدفة داخل مصفوفة مرتبة . [4] [5] يقارن البحث الثنائي قيمة الهدف بالعنصر الأوسط من المصفوفة. إذا لم تكن متساوية، يتم إزالة النصف الذي لا يمكن أن يقع فيه الهدف ويستمر البحث في النصف المتبقي، مرة أخرى مع أخذ العنصر الأوسط للمقارنة بقيمة الهدف، وتكرار ذلك حتى يتم العثور على قيمة الهدف. إذا انتهى البحث بنصف المتبقي فارغًا، فإن الهدف ليس في المصفوفة.
يتم تشغيل البحث الثنائي في وقت لوغاريتمي في أسوأ الحالات ، مما يؤدي إلى إجراء المقارنات، حيث هو عدد العناصر في المصفوفة. [أ] [6] البحث الثنائي أسرع من البحث الخطي باستثناء المصفوفات الصغيرة. ومع ذلك، يجب فرز المصفوفة أولاً حتى تتمكن من تطبيق البحث الثنائي. هناك هياكل بيانات متخصصة مصممة للبحث السريع، مثل جداول التجزئة ، والتي يمكن البحث فيها بكفاءة أكبر من البحث الثنائي. ومع ذلك، يمكن استخدام البحث الثنائي لحل مجموعة أوسع من المشكلات، مثل العثور على العنصر التالي الأصغر أو التالي الأكبر في المصفوفة بالنسبة للهدف حتى لو كان غائبًا عن المصفوفة.
توجد أشكال عديدة للبحث الثنائي. وعلى وجه الخصوص، يعمل التتابع الكسري على تسريع عمليات البحث الثنائي عن نفس القيمة في عدة مصفوفات. ويحل التتابع الكسري بكفاءة عددًا من مشكلات البحث في الهندسة الحسابية وفي العديد من المجالات الأخرى. ويمتد البحث الأسي إلى قوائم غير محدودة. وتعتمد هياكل بيانات شجرة البحث الثنائي وشجرة B على البحث الثنائي.
خوارزمية
يعمل البحث الثنائي على المصفوفات المصنفة. يبدأ البحث الثنائي بمقارنة عنصر في منتصف المصفوفة بقيمة الهدف. إذا كانت قيمة الهدف مطابقة للعنصر، يتم إرجاع موضعه في المصفوفة. إذا كانت قيمة الهدف أقل من العنصر، يستمر البحث في النصف السفلي من المصفوفة. إذا كانت قيمة الهدف أكبر من العنصر، يستمر البحث في النصف العلوي من المصفوفة. من خلال القيام بذلك، تستبعد الخوارزمية النصف الذي لا يمكن أن توجد فيه قيمة الهدف في كل تكرار. [7]
إجراء
بالنظر إلى مجموعة من العناصر ذات القيم أو السجلات المرتبة بحيث و وقيمة الهدف ، يستخدم البرنامج الفرعي التالي البحث الثنائي للعثور على مؤشر في . [7]
- تعيين إلى و إلى .
- إذا ، تنتهي عملية البحث باعتبارها غير ناجحة.
- اضبط (موضع العنصر الأوسط) على أرضية ، وهو أكبر عدد صحيح أقل من أو يساوي .
- إذا ، اضبط على وانتقل إلى الخطوة 2.
- إذا ، اضبط على وانتقل إلى الخطوة 2.
- الآن تم الانتهاء من البحث، العودة .
يتتبع هذا الإجراء التكراري حدود البحث باستخدام المتغيرين و . ويمكن التعبير عن الإجراء في الكود الزائف على النحو التالي، حيث تظل أسماء المتغيرات وأنواعها كما هي أعلاه، وهي دالة الأرضية ، وتشير إلى قيمة محددة تنقل فشل البحث. [7]floorunsuccessful

دالة البحث الثنائي (A, n, T) هي
ل := 0
ر := ن − 1
بينما L ≤ R
م := الطابق((L + R) / 2)
إذا كان A[m] < T فإن
ل := م + 1
وإلا إذا كان A[m] > T فإن
ر := م − 1
وإلا :
العودة م
العودة غير ناجحة
بدلاً من ذلك، قد تأخذ الخوارزمية الحد الأقصى . وقد يؤدي هذا إلى تغيير النتيجة إذا ظهرت القيمة المستهدفة أكثر من مرة في المصفوفة.
الإجراء البديل
في الإجراء أعلاه، تتحقق الخوارزمية مما إذا كان العنصر الأوسط ( ) مساويًا للهدف ( ) في كل تكرار. بعض التنفيذات تتجاهل هذا الفحص أثناء كل تكرار. ستنفذ الخوارزمية هذا الفحص فقط عندما يتبقى عنصر واحد (عندما ). يؤدي هذا إلى حلقة مقارنة أسرع، حيث يتم إزالة مقارنة واحدة لكل تكرار، بينما يتطلب الأمر تكرارًا واحدًا فقط في المتوسط. [8]
نشر هيرمان بوتينبروتش أول تنفيذ لاستبعاد هذا الاختبار في عام 1962. [8] [9]
- تعيين إلى و إلى .
- بينما ،
- اضبط (موضع العنصر الأوسط) على سقف ، وهو أصغر عدد صحيح أكبر من أو يساوي .
- إذا تم ضبطه على .
- وإلا؛ يتم ضبطه على .
- الآن ، تم الانتهاء من البحث. إذا ، ارجع . وإلا، تنتهي عملية البحث باعتبارها غير ناجحة.
أين ceilتوجد دالة السقف، الكود الزائف لهذه النسخة هو:
دالة binary_search_alternative(A, n, T) هي
ل := 0
ر := ن − 1
بينما L != R
م := السقف((L + R) / 2)
إذا كان A[m] > T فإن
ر := م − 1
آخر :
ل := م
إذا A[L] = T ، قم
بإرجاع L،
إرجاع غير ناجح
عناصر مكررة
قد يعيد الإجراء أي فهرس يكون عنصره مساويًا لقيمة الهدف، حتى إذا كانت هناك عناصر مكررة في المصفوفة. على سبيل المثال، إذا كانت المصفوفة المراد البحث فيها هي وكان الهدف هو ، فسيكون من الصحيح أن تعيد الخوارزمية إما العنصر الرابع (الفهرس 3) أو الخامس (الفهرس 4). سيعيد الإجراء العادي العنصر الرابع (الفهرس 3) في هذه الحالة. لا يعيد دائمًا التكرار الأول (ضع في اعتبارك أيهما لا يزال يعيد العنصر الرابع). ومع ذلك، من الضروري أحيانًا العثور على العنصر الموجود في أقصى اليسار أو أقصى اليمين لقيمة هدف مكررة في المصفوفة. في المثال أعلاه، يكون العنصر الرابع هو العنصر الموجود في أقصى اليسار للقيمة 4، بينما يكون العنصر الخامس هو العنصر الموجود في أقصى اليمين للقيمة 4. سيعيد الإجراء البديل أعلاه دائمًا فهرس العنصر الموجود في أقصى اليمين إذا كان مثل هذا العنصر موجودًا. [9]
إجراء للعثور على العنصر الموجود في أقصى اليسار
للعثور على العنصر الموجود في أقصى اليسار، يمكن استخدام الإجراء التالي: [10]
- تعيين إلى و إلى .
- بينما ،
- اضبط (موضع العنصر الأوسط) على أرضية ، وهو أكبر عدد صحيح أقل من أو يساوي .
- إذا تم ضبطه على .
- وإلا؛ يتم ضبطه على .
- يعود .
إذا و ، فإن العنصر الموجود في أقصى اليسار والذي يساوي . حتى إذا لم يكن في المصفوفة، فإن رتبة في المصفوفة، أو عدد العناصر في المصفوفة التي تكون أقل من .
أين floorتوجد دالة الأرضية، الكود الزائف لهذه النسخة هو:
دالة binary_search_leftmost(A, n, T):
ل := 0
ر := ن
بينما L < R:
م := الطابق((L + R) / 2)
إذا كان A[m] < T:
ل := م + 1
آخر :
ر := م
العودة ل
إجراءات العثور على العنصر الموجود في أقصى اليمين
للعثور على العنصر الموجود في أقصى اليمين، يمكن استخدام الإجراء التالي: [10]
- تعيين إلى و إلى .
- بينما ،
- اضبط (موضع العنصر الأوسط) على أرضية ، وهو أكبر عدد صحيح أقل من أو يساوي .
- إذا تم ضبطه على .
- وإلا؛ يتم ضبطه على .
- يعود .
إذا و ، فإن العنصر الموجود في أقصى اليمين يساوي . حتى إذا لم يكن في المصفوفة، فإن عدد العناصر في المصفوفة التي تكون أكبر من .
أين floorتوجد دالة الأرضية، الكود الزائف لهذه النسخة هو:
دالة binary_search_rightmost(A, n, T):
ل := 0
ر := ن
بينما L < R:
م := الطابق((L + R) / 2)
إذا كان A[m] > T:
ر := م
آخر :
ل := م + 1
العودة R - 1
المطابقات التقريبية

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


من حيث عدد المقارنات، يمكن تحليل أداء البحث الثنائي من خلال عرض تشغيل الإجراء على شجرة ثنائية. العقدة الجذرية للشجرة هي العنصر الأوسط من المصفوفة. العنصر الأوسط للنصف السفلي هو العقدة الفرعية اليسرى للجذر، والعنصر الأوسط للنصف العلوي هو العقدة الفرعية اليمنى للجذر. يتم بناء بقية الشجرة بطريقة مماثلة. بدءًا من العقدة الجذرية، يتم اجتياز الأشجار الفرعية اليسرى أو اليمنى اعتمادًا على ما إذا كانت القيمة المستهدفة أقل أو أكثر من العقدة قيد النظر. [6] [14]
في أسوأ الحالات، يقوم البحث الثنائي بإجراء تكرارات لحلقة المقارنة، حيث يشير الترميز إلى دالة الحد الأدنى التي تنتج أكبر عدد صحيح أقل من أو يساوي الوسيطة، وهو اللوغاريتم الثنائي . وذلك لأن أسوأ الحالات يتم الوصول إليها عندما يصل البحث إلى أعمق مستوى في الشجرة، وهناك دائمًا مستويات في الشجرة لأي بحث ثنائي.
قد يتم الوصول إلى أسوأ حالة أيضًا عندما لا يكون العنصر المستهدف موجودًا في المصفوفة. إذا كان أقل من قوة اثنين بمقدار واحد، فهذه هي الحالة دائمًا. بخلاف ذلك، قد يقوم البحث بإجراء تكرارات إذا وصل البحث إلى أعمق مستوى في الشجرة. ومع ذلك، قد يقوم بإجراء تكرارات ، وهي أقل بمقدار واحد من أسوأ حالة، إذا انتهى البحث عند ثاني أعمق مستوى في الشجرة. [15]
في المتوسط، بافتراض أن احتمالية البحث عن كل عنصر متساوية، يقوم البحث الثنائي بإجراء التكرارات عندما يكون العنصر المستهدف في المصفوفة. وهذا يساوي تقريبًا التكرارات. عندما لا يكون العنصر المستهدف في المصفوفة، يقوم البحث الثنائي بإجراء التكرارات في المتوسط، بافتراض أن احتمالية البحث في النطاق بين العناصر وخارجها متساوية. [14]
في أفضل الأحوال، عندما تكون القيمة المستهدفة هي العنصر الأوسط في المصفوفة، يتم إرجاع موضعها بعد تكرار واحد. [16]
من حيث التكرارات، لا يمكن لأي خوارزمية بحث تعمل فقط عن طريق مقارنة العناصر أن تُظهر أداءً متوسطًا وأسوأ حالة أفضل من البحث الثنائي. تحتوي شجرة المقارنة التي تمثل البحث الثنائي على أقل عدد ممكن من المستويات حيث يتم ملء كل مستوى أعلى من أدنى مستوى في الشجرة بالكامل. [ب] بخلاف ذلك، يمكن لخوارزمية البحث التخلص من عدد قليل من العناصر في التكرار، مما يزيد من عدد التكرارات المطلوبة في المتوسط وأسوأ حالة. هذا هو الحال بالنسبة لخوارزميات البحث الأخرى القائمة على المقارنات، حيث على الرغم من أنها قد تعمل بشكل أسرع على بعض قيم الهدف، فإن الأداء المتوسط لجميع العناصر يكون أسوأ من البحث الثنائي. من خلال تقسيم المصفوفة إلى نصفين، يضمن البحث الثنائي أن يكون حجم كلتا المصفوفتين الفرعيتين متشابهًا قدر الإمكان. [14]
تعقيد الفضاء
يتطلب البحث الثنائي ثلاثة مؤشرات إلى العناصر، والتي قد تكون مؤشرات مصفوفة أو مؤشرات إلى مواقع الذاكرة، بغض النظر عن حجم المصفوفة. وبالتالي، فإن تعقيد المساحة للبحث الثنائي يكمن في نموذج ذاكرة الوصول العشوائي للكلمات.
اشتقاق الحالة المتوسطة
يعتمد متوسط عدد التكرارات التي يتم إجراؤها بواسطة البحث الثنائي على احتمالية البحث عن كل عنصر. يختلف متوسط الحالة لعمليات البحث الناجحة عن عمليات البحث غير الناجحة. سيتم افتراض أن كل عنصر من المرجح أن يتم البحث عنه بنجاح. بالنسبة لعمليات البحث غير الناجحة، سيتم افتراض أن الفواصل بين العناصر وخارجها من المرجح أن يتم البحث عنها بنفس القدر. متوسط الحالة لعمليات البحث الناجحة هو عدد التكرارات المطلوبة للبحث عن كل عنصر مرة واحدة بالضبط، مقسومًا على ، عدد العناصر. متوسط الحالة لعمليات البحث غير الناجحة هو عدد التكرارات المطلوبة للبحث عن عنصر داخل كل فترة مرة واحدة بالضبط، مقسومًا على الفواصل. [14]
عمليات بحث ناجحة
في تمثيل الشجرة الثنائية، يمكن تمثيل البحث الناجح بمسار من الجذر إلى العقدة المستهدفة، يسمى المسار الداخلي . طول المسار هو عدد الحواف (الاتصالات بين العقد) التي يمر بها المسار. عدد التكرارات التي يتم إجراؤها بواسطة البحث، بشرط أن يكون للمسار المقابل طول ، هو حساب التكرار الأولي. طول المسار الداخلي هو مجموع أطوال جميع المسارات الداخلية الفريدة. نظرًا لوجود مسار واحد فقط من الجذر إلى أي عقدة واحدة، فإن كل مسار داخلي يمثل بحثًا عن عنصر معين. إذا كان هناك عناصر، وهو عدد صحيح موجب، وطول المسار الداخلي هو ، فإن متوسط عدد التكرارات لبحث ناجح ، مع إضافة التكرار الواحد لحساب التكرار الأولي. [14]
نظرًا لأن البحث الثنائي هو الخوارزمية المثلى للبحث باستخدام المقارنات، فإن هذه المشكلة تقتصر على حساب الحد الأدنى لطول المسار الداخلي لجميع الأشجار الثنائية التي تحتوي على عقد، والذي يساوي: [17]
على سبيل المثال، في مصفوفة مكونة من 7 عناصر، يتطلب الجذر تكرارًا واحدًا، ويتطلب العنصران الموجودان أسفل الجذر تكرارين، وتتطلب العناصر الأربعة الموجودة أسفله ثلاث تكرارات. في هذه الحالة، يكون طول المسار الداخلي: [17]
سيتم حساب متوسط عدد التكرارات بناءً على معادلة الحالة المتوسطة. يمكن تبسيط المجموع إلى: [14]
استبدال المعادلة لـ في المعادلة لـ : [14]
بالنسبة للعدد الصحيح ، فإن هذا يعادل معادلة الحالة المتوسطة في البحث الناجح المحدد أعلاه.
عمليات بحث غير ناجحة
يمكن تمثيل عمليات البحث غير الناجحة عن طريق زيادة الشجرة بالعقد الخارجية ، والتي تشكل شجرة ثنائية ممتدة . إذا كانت العقدة الداخلية، أو العقدة الموجودة في الشجرة، بها أقل من عقدتين فرعيتين، فسيتم إضافة عقد فرعية إضافية، تسمى العقد الخارجية، بحيث يكون لكل عقدة داخلية طفلان. من خلال القيام بذلك، يمكن تمثيل البحث غير الناجح كمسار إلى عقدة خارجية، حيث يكون العنصر الأصلي هو العنصر الوحيد المتبقي أثناء التكرار الأخير. المسار الخارجي هو مسار من الجذر إلى عقدة خارجية. طول المسار الخارجي هو مجموع أطوال جميع المسارات الخارجية الفريدة. إذا كان هناك عناصر، وهو عدد صحيح موجب، وكان طول المسار الخارجي هو ، فإن متوسط عدد التكرارات لعملية بحث غير ناجحة ، مع إضافة تكرار واحد لحساب التكرار الأولي. يتم تقسيم طول المسار الخارجي على بدلاً من لأن هناك مسارات خارجية، تمثل الفواصل بين عناصر المصفوفة وخارجها. [14]
يمكن تقليص هذه المشكلة على نحو مماثل إلى تحديد الحد الأدنى لطول المسار الخارجي لجميع الأشجار الثنائية التي تحتوي على عقد. بالنسبة لجميع الأشجار الثنائية، يكون طول المسار الخارجي مساويًا لطول المسار الداخلي زائدًا . [17] استبدال المعادلة بـ : [14]
من خلال استبدال المعادلة الخاصة بـ في المعادلة الخاصة بـ ، يمكن تحديد الحالة المتوسطة لعمليات البحث غير الناجحة: [14]
أداء الإجراء البديل
كل تكرار لإجراء البحث الثنائي المحدد أعلاه يقوم بإجراء مقارنة واحدة أو اثنتين، للتحقق مما إذا كان العنصر الأوسط مساويًا للهدف في كل تكرار. وبافتراض أن احتمالية البحث عن كل عنصر متساوية، فإن كل تكرار يقوم بإجراء 1.5 مقارنة في المتوسط. يتحقق أحد أشكال الخوارزمية مما إذا كان العنصر الأوسط مساويًا للهدف في نهاية البحث. وفي المتوسط، يؤدي هذا إلى إزالة نصف مقارنة من كل تكرار. وهذا يقلل قليلاً من الوقت المستغرق لكل تكرار على معظم أجهزة الكمبيوتر. ومع ذلك، فإنه يضمن أن يستغرق البحث الحد الأقصى من التكرارات، في المتوسط إضافة تكرار واحد إلى البحث. ولأن حلقة المقارنة يتم إجراؤها مرات فقط في أسوأ الأحوال، فإن الزيادة الطفيفة في الكفاءة لكل تكرار لا تعوض عن التكرار الإضافي لجميع العناصر باستثناء العناصر الكبيرة جدًا . [ج] [18] [19]
وقت التشغيل واستخدام ذاكرة التخزين المؤقت
عند تحليل أداء البحث الثنائي، فإن الاعتبار الآخر هو الوقت المطلوب لمقارنة عنصرين. بالنسبة للأعداد الصحيحة والسلاسل، يزداد الوقت المطلوب خطيًا مع زيادة طول ترميز العناصر (عادةً عدد البتات ). على سبيل المثال، تتطلب مقارنة زوج من الأعداد الصحيحة غير الموقعة ذات 64 بت مقارنة ما يصل إلى ضعف البتات مثل مقارنة زوج من الأعداد الصحيحة غير الموقعة ذات 32 بت. يتم تحقيق أسوأ حالة عندما تكون الأعداد الصحيحة متساوية. يمكن أن يكون هذا مهمًا عندما تكون أطوال ترميز العناصر كبيرة، كما هو الحال مع أنواع الأعداد الصحيحة الكبيرة أو السلاسل الطويلة، مما يجعل مقارنة العناصر مكلفة. علاوة على ذلك، غالبًا ما تكون مقارنة قيم الفاصلة العائمة (التمثيل الرقمي الأكثر شيوعًا للأعداد الحقيقية ) أكثر تكلفة من مقارنة الأعداد الصحيحة أو السلاسل القصيرة.
في معظم بنيات الكمبيوتر، يحتوي المعالج على ذاكرة تخزين مؤقتة منفصلة عن ذاكرة الوصول العشوائي . ونظرًا لوجودها داخل المعالج نفسه، فإن الوصول إلى ذاكرة التخزين المؤقت يكون أسرع كثيرًا ولكنها تخزن عادةً بيانات أقل بكثير من ذاكرة الوصول العشوائي. لذلك، تخزن معظم المعالجات مواقع الذاكرة التي تم الوصول إليها مؤخرًا، إلى جانب مواقع الذاكرة القريبة منها. على سبيل المثال، عند الوصول إلى عنصر مصفوفة، قد يتم تخزين العنصر نفسه مع العناصر المخزنة بالقرب منه في ذاكرة الوصول العشوائي، مما يجعل الوصول إلى عناصر المصفوفة القريبة من بعضها البعض ( موقع المرجع ) أسرع. في المصفوفة المرتبة، يمكن للبحث الثنائي القفز إلى مواقع ذاكرة بعيدة إذا كانت المصفوفة كبيرة، على عكس الخوارزميات (مثل البحث الخطي والفحص الخطي في جداول التجزئة ) التي تصل إلى العناصر بالتسلسل. وهذا يضيف قليلاً إلى وقت تشغيل البحث الثنائي للمصفوفات الكبيرة على معظم الأنظمة. [20]
البحث الثنائي مقابل المخططات الأخرى
تعتبر المصفوفات المصنفة مع البحث الثنائي حلاً غير فعال للغاية عندما تتداخل عمليات الإدخال والحذف مع الاسترجاع، مما يستغرق وقتًا لكل عملية من هذا القبيل. بالإضافة إلى ذلك، يمكن للمصفوفات المصنفة أن تعقد استخدام الذاكرة خاصةً عندما يتم إدخال العناصر غالبًا في المصفوفة. [21] هناك هياكل بيانات أخرى تدعم الإدراج والحذف بكفاءة أكبر بكثير. يمكن استخدام البحث الثنائي لإجراء المطابقة الدقيقة وعضوية المجموعة (تحديد ما إذا كانت قيمة الهدف موجودة في مجموعة من القيم). هناك هياكل بيانات تدعم المطابقة الدقيقة الأسرع وعضوية المجموعة. ومع ذلك، على عكس العديد من مخططات البحث الأخرى، يمكن استخدام البحث الثنائي للمطابقة التقريبية الفعالة، وعادةً ما يتم إجراء مثل هذه المطابقات في الوقت المناسب بغض النظر عن نوع أو بنية القيم نفسها. [22] بالإضافة إلى ذلك، هناك بعض العمليات، مثل العثور على أصغر وأكبر عنصر، والتي يمكن إجراؤها بكفاءة على مصفوفة مرتبة. [11]
البحث الخطي
البحث الخطي هو خوارزمية بحث بسيطة تتحقق من كل سجل حتى تجد القيمة المستهدفة. يمكن إجراء البحث الخطي على قائمة مرتبطة، مما يسمح بالإدراج والحذف بشكل أسرع من المصفوفة. البحث الثنائي أسرع من البحث الخطي للمصفوفات المفرزة إلا إذا كانت المصفوفة قصيرة، على الرغم من أن المصفوفة تحتاج إلى فرز مسبقًا. [د] [24] تتطلب جميع خوارزميات الفرز القائمة على مقارنة العناصر، مثل الفرز السريع والفرز بالدمج ، مقارنات على الأقل في أسوأ الحالات. [25] على عكس البحث الخطي، يمكن استخدام البحث الثنائي للمطابقة التقريبية الفعالة. هناك عمليات مثل العثور على أصغر وأكبر عنصر يمكن إجراؤها بكفاءة على مصفوفة مرتبة ولكن ليس على مصفوفة غير مرتبة. [26]
الأشجار

شجرة البحث الثنائية هي بنية بيانات شجرة ثنائية تعمل على أساس مبدأ البحث الثنائي. يتم ترتيب سجلات الشجرة بترتيب مرتب، ويمكن البحث عن كل سجل في الشجرة باستخدام خوارزمية مشابهة للبحث الثنائي، وتستغرق وقتًا لوغاريتميًا متوسطًا. تتطلب عملية الإدراج والحذف أيضًا وقتًا لوغاريتميًا متوسطًا في أشجار البحث الثنائية. يمكن أن يكون هذا أسرع من عملية الإدراج والحذف الخطية للمصفوفات المفرزة، وتحتفظ الأشجار الثنائية بالقدرة على إجراء جميع العمليات الممكنة على مصفوفة مفرزة، بما في ذلك الاستعلامات النطاقية والتقريبية. [22] [27]
ومع ذلك، فإن البحث الثنائي يكون عادةً أكثر كفاءة في البحث حيث من المرجح أن تكون أشجار البحث الثنائي غير متوازنة بشكل كامل، مما يؤدي إلى أداء أسوأ قليلاً من البحث الثنائي. وهذا ينطبق حتى على أشجار البحث الثنائي المتوازنة ، أشجار البحث الثنائي التي توازن عقدها الخاصة، لأنها نادرًا ما تنتج الشجرة بأقل عدد ممكن من المستويات. باستثناء أشجار البحث الثنائي المتوازنة، قد تكون الشجرة غير متوازنة بشدة مع وجود عدد قليل من العقد الداخلية مع طفلين، مما يؤدي إلى اقتراب متوسط وقت البحث وأسوأ حالة من المقارنات. [هـ] تشغل أشجار البحث الثنائي مساحة أكبر من المصفوفات المصنفة. [29]
تلائم أشجار البحث الثنائية البحث السريع في الذاكرة الخارجية المخزنة على الأقراص الصلبة، حيث يمكن هيكلة أشجار البحث الثنائية بكفاءة في أنظمة الملفات. تعمم شجرة B هذه الطريقة في تنظيم الشجرة. تُستخدم أشجار B بشكل متكرر لتنظيم التخزين طويل الأمد مثل قواعد البيانات وأنظمة الملفات . [30] [31]
التجزئة
لتنفيذ المصفوفات الترابطية ، تكون جداول التجزئة ، وهي بنية بيانات تربط المفاتيح بالسجلات باستخدام دالة تجزئة ، أسرع بشكل عام من البحث الثنائي على مصفوفة مرتبة من السجلات. [32] تتطلب معظم تطبيقات جدول التجزئة وقتًا ثابتًا مستهلكًا فقط في المتوسط. [f] [34] ومع ذلك، فإن التجزئة ليست مفيدة للمطابقات التقريبية، مثل حساب المفتاح التالي الأصغر والأكبر والأقرب، حيث أن المعلومات الوحيدة المقدمة في بحث فاشل هي أن الهدف غير موجود في أي سجل. [35] يعد البحث الثنائي مثاليًا لمثل هذه المطابقات، حيث يتم إجراؤها في وقت لوغاريتمي. يدعم البحث الثنائي أيضًا المطابقات التقريبية. يمكن إجراء بعض العمليات، مثل العثور على أصغر وأكبر عنصر، بكفاءة على المصفوفات المرتبة ولكن ليس على جداول التجزئة. [22]
تعيين خوارزميات العضوية
هناك مشكلة مرتبطة بالبحث وهي عضوية المجموعة . يمكن أيضًا استخدام أي خوارزمية تقوم بالبحث، مثل البحث الثنائي، لعضوية المجموعة. هناك خوارزميات أخرى أكثر ملاءمة لعضوية المجموعة. تعد مجموعة البتات هي الأبسط، ومفيدة عندما يكون نطاق المفاتيح محدودًا. إنها تخزن بشكل مضغوط مجموعة من البتات ، حيث يمثل كل بت مفتاحًا واحدًا ضمن نطاق المفاتيح. تعد مجموعات البتات سريعة جدًا، ولا تتطلب سوى الوقت. [36] يتعامل نوع Judy1 من مجموعة Judy مع مفاتيح 64 بت بكفاءة. [37]
للحصول على نتائج تقريبية، تقوم مرشحات بلوم ، وهي بنية بيانات احتمالية أخرى تعتمد على التجزئة، بتخزين مجموعة من المفاتيح عن طريق ترميز المفاتيح باستخدام مصفوفة بتات ووظائف تجزئة متعددة. تعد مرشحات بلوم أكثر كفاءة في استخدام المساحة من مصفوفات البتات في معظم الحالات وليست أبطأ كثيرًا: مع وظائف التجزئة، تتطلب استعلامات العضوية الوقت فقط. ومع ذلك، تعاني مرشحات بلوم من الإيجابيات الخاطئة . [g] [h] [39]
هياكل البيانات الأخرى
توجد هياكل بيانات قد تعمل على تحسين البحث الثنائي في بعض الحالات لكل من عمليات البحث والعمليات الأخرى المتاحة للمصفوفات المرتبة. على سبيل المثال، يمكن إجراء عمليات البحث والمطابقات التقريبية والعمليات المتاحة للمصفوفات المرتبة بكفاءة أكبر من البحث الثنائي على هياكل البيانات المتخصصة مثل أشجار فان إمدي بواس وأشجار الاندماج والمحاولات ومصفوفات البتات . عادةً ما تكون هياكل البيانات المتخصصة هذه أسرع فقط لأنها تستفيد من خصائص المفاتيح ذات السمة المعينة (عادةً المفاتيح التي تكون أعدادًا صحيحة صغيرة)، وبالتالي ستستهلك الوقت أو المساحة للمفاتيح التي تفتقر إلى هذه السمة. [22] طالما يمكن ترتيب المفاتيح، يمكن دائمًا إجراء هذه العمليات بكفاءة على الأقل على مصفوفة مرتبة بغض النظر عن المفاتيح. تستخدم بعض الهياكل، مثل مصفوفات جودي، مجموعة من الأساليب للتخفيف من ذلك مع الاحتفاظ بالكفاءة والقدرة على إجراء المطابقة التقريبية. [37]
الاختلافات
البحث الثنائي الموحد

يخزن البحث الثنائي الموحد، بدلاً من الحدود الدنيا والعليا، الفرق في مؤشر العنصر الأوسط من التكرار الحالي إلى التكرار التالي. يتم حساب جدول بحث يحتوي على الاختلافات مسبقًا. على سبيل المثال، إذا كانت المصفوفة المراد البحث فيها هي [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] ، فسيكون العنصر الأوسط ( ) هو 6. في هذه الحالة، يكون العنصر الأوسط للمصفوفة الفرعية اليسرى ( [1, 2, 3, 4, 5] ) هو 3 والعنصر الأوسط للمصفوفة الفرعية اليمنى ( [7, 8, 9, 10, 11] ) هو 9. سيخزن البحث الثنائي الموحد قيمة 3 حيث يختلف كلا المؤشرين عن 6 بنفس المقدار. [40] لتقليل مساحة البحث، تضيف الخوارزمية هذا التغيير أو تطرحه من مؤشر العنصر الأوسط. قد يكون البحث الثنائي الموحد أسرع في الأنظمة التي يكون فيها حساب نقطة المنتصف غير فعال، مثل أجهزة الكمبيوتر العشرية . [41]
البحث الأسّي

يمتد البحث الأسّي إلى البحث الثنائي ليشمل القوائم غير المحدودة. ويبدأ بالعثور على أول عنصر بفهرس يكون في نفس الوقت أسًا للرقم اثنين وأكبر من القيمة المستهدفة. وبعد ذلك، يضبط هذا الفهرس كحد أعلى، ويتحول إلى البحث الثنائي. يستغرق البحث تكرارات قبل بدء البحث الثنائي وفي معظم تكرارات البحث الثنائي، حيث هو موضع القيمة المستهدفة. يعمل البحث الأسّي على القوائم المحدودة، ولكنه يصبح تحسنًا على البحث الثنائي فقط إذا كانت القيمة المستهدفة تقع بالقرب من بداية المصفوفة. [42]
بحث الاستيفاء

بدلاً من حساب نقطة المنتصف، يقوم البحث الاستقصائي بتقدير موضع القيمة المستهدفة، مع مراعاة أدنى وأعلى العناصر في المصفوفة بالإضافة إلى طول المصفوفة. وهو يعمل على أساس أن نقطة المنتصف ليست أفضل تخمين في كثير من الحالات. على سبيل المثال، إذا كانت القيمة المستهدفة قريبة من أعلى عنصر في المصفوفة، فمن المرجح أن تكون موجودة بالقرب من نهاية المصفوفة. [43]
دالة الاستيفاء الشائعة هي الاستيفاء الخطي . إذا كانت هي المصفوفة، وهما الحدان الأدنى والأعلى على التوالي، و هي الهدف، فإن الهدف يُقدر بأنه على بعد حوالي من و . عند استخدام الاستيفاء الخطي، وتوزيع عناصر المصفوفة موحد أو شبه موحد، فإن بحث الاستيفاء يُجري مقارنات. [43] [44] [45]
في الممارسة العملية، يكون البحث عن طريق الاستيفاء أبطأ من البحث الثنائي للمصفوفات الصغيرة، حيث يتطلب البحث عن طريق الاستيفاء حسابات إضافية. وتنمو تعقيداته الزمنية بشكل أبطأ من البحث الثنائي، ولكن هذا يعوض فقط عن الحسابات الإضافية للمصفوفات الكبيرة. [43]
التتابع الكسري

التتابع الكسري هو تقنية تعمل على تسريع عمليات البحث الثنائية لنفس العنصر في عدة مصفوفات مرتبة. يتطلب البحث في كل مصفوفة على حدة وقتًا، حيث هو عدد المصفوفات. يقلل التتابع الكسري هذا إلى تخزين معلومات محددة في كل مصفوفة حول كل عنصر وموقعه في المصفوفات الأخرى. [46] [47]
تم تطوير التتابع الكسري في الأصل لحل العديد من مشكلات الهندسة الحسابية بكفاءة . تم تطبيق التتابع الكسري في أماكن أخرى، مثل استخراج البيانات وتوجيه بروتوكول الإنترنت . [46]
التعميم على الرسوم البيانية
تم تعميم البحث الثنائي للعمل على أنواع معينة من الرسوم البيانية، حيث يتم تخزين القيمة المستهدفة في رأس بدلاً من عنصر مصفوفة. أشجار البحث الثنائي هي أحد هذه التعميمات - عندما يتم الاستعلام عن رأس (عقدة) في الشجرة، تتعلم الخوارزمية إما أن الرأس هو الهدف، أو في أي شجرة فرعية سيكون الهدف موجودًا فيها. ومع ذلك، يمكن تعميم ذلك على النحو التالي: نظرًا لوجود رسم بياني غير موجه ومرجح إيجابيًا ورأس مستهدف، تتعلم الخوارزمية عند الاستعلام عن رأس أنه يساوي الهدف، أو يتم منحها حافة واردة تقع على أقصر مسار من الرأس المستعلم عنه إلى الهدف. خوارزمية البحث الثنائي القياسية هي ببساطة الحالة التي يكون فيها الرسم البياني عبارة عن مسار. وبالمثل، فإن أشجار البحث الثنائي هي الحالة التي يتم فيها إعطاء الحواف إلى الأشجار الفرعية اليسرى أو اليمنى عندما تكون الرأس المستعلم عنها غير مساوية للهدف. بالنسبة لجميع الرسوم البيانية غير الموجهة والمرجحة إيجابيا، هناك خوارزمية تجد الرأس المستهدف في الاستعلامات في أسوأ الحالات. [48]
البحث الثنائي الصاخب

تحل خوارزميات البحث الثنائي الصاخبة الحالة التي لا تستطيع فيها الخوارزمية مقارنة عناصر المصفوفة بشكل موثوق. لكل زوج من العناصر، هناك احتمال معين بأن تقوم الخوارزمية بالمقارنة الخاطئة. يمكن للبحث الثنائي الصاخب العثور على الموضع الصحيح للهدف باحتمالية معينة تتحكم في موثوقية الموضع الناتج. يجب على كل إجراء بحث ثنائي صاخب إجراء مقارنات على الأقل في المتوسط، حيث هي دالة إنتروبيا الثنائية و هي احتمال أن ينتج الإجراء الموضع الخاطئ. [49] [50] [51] يمكن اعتبار مشكلة البحث الثنائي الصاخب حالة من لعبة ريني-أولام ، [52] أحد أشكال لعبة العشرين سؤالاً حيث قد تكون الإجابات خاطئة. [53]
البحث الثنائي الكمومي
تقتصر أجهزة الكمبيوتر الكلاسيكية على أسوأ حالة من التكرارات الدقيقة عند إجراء بحث ثنائي. لا تزال الخوارزميات الكمومية للبحث الثنائي مقيدة بنسبة من الاستعلامات (تمثل تكرارات الإجراء الكلاسيكي)، ولكن العامل الثابت أقل من واحد، مما يوفر تعقيدًا زمنيًا أقل على أجهزة الكمبيوتر الكمومية . أي إجراء بحث ثنائي كمي دقيق - أي إجراء يعطي دائمًا النتيجة الصحيحة - يتطلب استعلامات على الأقل في أسوأ الحالات، حيث هو اللوغاريتم الطبيعي . [54] يوجد إجراء بحث ثنائي كمي دقيق يعمل في الاستعلامات في أسوأ الحالات. [55] بالمقارنة، تعد خوارزمية جروفر هي الخوارزمية الكمومية المثلى للبحث في قائمة غير مرتبة من العناصر، وتتطلب استعلامات. [56]
تاريخ
تعود فكرة فرز قائمة العناصر للسماح بالبحث بشكل أسرع إلى العصور القديمة. كان أقدم مثال معروف هو لوح Inakibit-Anu من بابل الذي يعود تاريخه إلى حوالي 200 قبل الميلاد . احتوى اللوح على حوالي 500 رقم ستيني ومقلوباتها مرتبة حسب الترتيب المعجمي ، مما جعل البحث عن إدخال معين أسهل . بالإضافة إلى ذلك، تم اكتشاف العديد من قوائم الأسماء التي تم فرزها حسب الحرف الأول منها في جزر بحر إيجه . كان Catholicon ، وهو قاموس لاتيني انتهى في عام 1286 م، أول عمل يصف قواعد فرز الكلمات حسب الترتيب الأبجدي، بدلاً من الأحرف القليلة الأولى فقط. [9]
في عام 1946، ذكر جون ماوتشلي لأول مرة البحث الثنائي كجزء من محاضرات مدرسة مور ، وهي دورة جامعية أساسية في الحوسبة. [9] في عام 1957، نشر ويليام ويسلي بيترسون أول طريقة للبحث الاستيفاء. [9] [57] عملت كل خوارزمية بحث ثنائي منشورة فقط على المصفوفات التي يقل طولها عن قوة اثنين بمقدار واحد [i] حتى عام 1960، عندما نشر ديريك هنري ليهمر خوارزمية بحث ثنائي تعمل على جميع المصفوفات. [59] في عام 1962، قدم هيرمان بوتينبروخ تنفيذًا للبحث الثنائي ALGOL 60 الذي وضع المقارنة للمساواة في النهاية، مما زاد متوسط عدد التكرارات بمقدار واحد، ولكن قلل إلى واحد عدد المقارنات لكل تكرار. [8] تم تطوير البحث الثنائي الموحد بواسطة AK Chandra من جامعة ستانفورد في عام 1971. [9] في عام 1986، قدم برنارد شازيل وليونيداس جيه. جيباس التتابع الكسري كطريقة لحل العديد من مشاكل البحث في الهندسة الحسابية . [46] [60] [61]
قضايا التنفيذ
على الرغم من أن الفكرة الأساسية للبحث الثنائي واضحة نسبيًا، إلا أن التفاصيل قد تكون صعبة بشكل مدهش
— دونالد كنوث [2]
عندما عيّن جون بنتلي البحث الثنائي كمشكلة في دورة للمبرمجين المحترفين، وجد أن تسعين بالمائة فشلوا في تقديم حل صحيح بعد عدة ساعات من العمل عليه، ويرجع ذلك أساسًا إلى فشل التنفيذات غير الصحيحة في التشغيل أو إرجاع إجابة خاطئة في حالات نادرة . [62] تُظهر دراسة نُشرت عام 1988 أن الكود الدقيق لها موجود فقط في خمسة من أصل عشرين كتابًا مدرسيًا. [63] علاوة على ذلك، احتوى تنفيذ بنتلي الخاص للبحث الثنائي، الذي نُشر في كتابه Programming Pearls عام 1986 ، على خطأ فيض ظل غير مكتشف لأكثر من عشرين عامًا. كان تنفيذ مكتبة لغة برمجة جافا للبحث الثنائي يعاني من نفس خطأ الفيض لأكثر من تسع سنوات. [64]
في التنفيذ العملي، غالبًا ما تكون المتغيرات المستخدمة لتمثيل المؤشرات ذات حجم ثابت (أعداد صحيحة)، وقد يؤدي هذا إلى تجاوز فيض حسابي للمصفوفات الكبيرة جدًا. إذا تم حساب نقطة المنتصف للنطاق على أنها ، فقد تتجاوز قيمة نطاق الأعداد الصحيحة لنوع البيانات المستخدم لتخزين نقطة المنتصف، حتى إذا كانت و ضمن النطاق. إذا كانت و غير سالبة، فيمكن تجنب ذلك عن طريق حساب نقطة المنتصف على أنها . [65]
قد تحدث حلقة لا نهائية إذا لم يتم تعريف شروط الخروج للحلقة بشكل صحيح. بمجرد تجاوز ، فإن البحث قد فشل ويجب أن ينقل فشل البحث. بالإضافة إلى ذلك، يجب الخروج من الحلقة عند العثور على العنصر المستهدف، أو في حالة التنفيذ حيث يتم نقل هذا الفحص إلى النهاية، يجب أن تكون عمليات التحقق مما إذا كان البحث ناجحًا أو فاشلاً في النهاية موجودة. وجد بنتلي أن معظم المبرمجين الذين نفذوا البحث الثنائي بشكل غير صحيح ارتكبوا خطأ في تحديد شروط الخروج. [8] [66]
دعم المكتبة
تتضمن مكتبات العديد من اللغات القياسية إجراءات بحث ثنائية:
- توفر لغة C الوظيفة
bsearch()في مكتبتها القياسية ، والتي يتم تنفيذها عادةً عبر البحث الثنائي، على الرغم من أن المعيار الرسمي لا يتطلب ذلك. [67] - توفر مكتبة C++ القياسية الوظائف
binary_search()،lower_bound()،upper_bound()وequal_range(). [68] - توفر مكتبة Phobos القياسية في لغة D
std.range، في الوحدة النمطية، نوعًاSortedRange(يتم إرجاعه بواسطة الوظائفsort()وassumeSorted()) مع الطرقcontains()وequaleRange()وlowerBound()وtrisect()التي تستخدم تقنيات البحث الثنائي بشكل افتراضي للنطاقات التي توفر وصولاً عشوائيًا. [69] - توفر لغة COBOL
SEARCH ALLالفعل لإجراء عمليات بحث ثنائية على جداول مرتبة بلغة COBOL. [70] - تحتوي حزمة مكتبة Go القياسية
sortعلى الوظائفSearch،SearchInts،SearchFloat64s، وSearchStrings، والتي تنفذ البحث الثنائي العام، بالإضافة إلى تنفيذات محددة للبحث في شرائح الأعداد الصحيحة، والأعداد ذات الفاصلة العائمة، والسلاسل، على التوالي. [71] - توفر Java مجموعة من الطرق الثابتة المحملة
binarySearch()في الفئاتArraysوفي الحزمةCollectionsالقياسيةjava.utilلإجراء عمليات بحث ثنائية على مصفوفات Java وعلىLists على التوالي. [72] [73] - يقدم إطار عمل Microsoft .NET Framework 2.0 إصدارات عامة ثابتة من خوارزمية البحث الثنائي في فئات قاعدة المجموعة الخاصة به. ومن الأمثلة على ذلك
System.ArrayطريقةBinarySearch<T>(T[] array, T value). [74] - بالنسبة لـ Objective-C ، يوفر إطار عمل Cocoa
NSArray -indexOfObject:inSortedRange:options:usingComparator:الطريقة في Mac OS X 10.6+. [75] يحتوي إطار عمل Core Foundation C الخاص بشركة Apple أيضًا علىCFArrayBSearchValues()وظيفة. [76] - يوفر بايثون
bisectالوحدة التي تحافظ على القائمة مرتبة دون الحاجة إلى فرز القائمة بعد كل إدراج. [77] - تتضمن فئة Array في Ruby
bsearchطريقة ذات مطابقة تقريبية مدمجة. [78] - توفر شريحة Rust
binary_search()البدائية ،binary_search_by()،binary_search_by_key()، وpartition_point(). [79]
انظر أيضا
- طريقة التقسيم الثنائي – خوارزمية لإيجاد صفر الدالة – نفس الفكرة المستخدمة لحل المعادلات في الأعداد الحقيقية
- البحث الثنائي المضاعف – تباين البحث الثنائي مع حساب نقطة المنتصف المبسطة
الملاحظات والمراجع
تم تقديم هذه المقالة إلى WikiJournal of Science للمراجعة الأكاديمية الخارجية في عام 2018 (تقارير المراجعين). تمت إعادة دمج المحتوى المحدث في صفحة ويكيبيديا بموجب ترخيص CC-BY-SA-3.0 ( 2019 ). إصدار السجل كما تمت مراجعته هو:
Anthony Lin؛ et al. (2 يوليو 2019). "خوارزمية البحث الثنائي" (PDF) . WikiJournal of Science . 2 (1): 5. doi : 10.15347/WJS/2019.005 . ISSN 2470-6345. Wikidata Q81434400.
ملحوظات
- ^ The هو ترميز Big O ، و هو اللوغاريتم . في ترميز Big O، لا يهم أساس اللوغاريتم لأن كل لوغاريتم لقاعدة معينة هو عامل ثابت للوغاريتم الآخر لقاعدة أخرى. أي أن، حيث هو ثابت.
- ^ يمكن تمثيل أي خوارزمية بحث تعتمد فقط على المقارنات باستخدام شجرة مقارنة ثنائية. المسار الداخلي هو أي مسار من الجذر إلى عقدة موجودة. ليكن طول المسار الداخلي ، مجموع أطوال جميع المسارات الداخلية. إذا كان من المرجح أن يتم البحث عن كل عنصر على قدم المساواة، فإن الحالة المتوسطة هي أو ببساطة واحد زائد متوسط جميع أطوال المسارات الداخلية للشجرة. وذلك لأن المسارات الداخلية تمثل العناصر التي تقارنها خوارزمية البحث بالهدف. تمثل أطوال هذه المسارات الداخلية عدد التكرارات بعد عقدة الجذر. يؤدي إضافة متوسط هذه الأطوال إلى التكرار الواحد في الجذر إلى الحالة المتوسطة. لذلك، لتقليل متوسط عدد المقارنات، يجب تقليل طول المسار الداخلي. اتضح أن شجرة البحث الثنائي تقلل من طول المسار الداخلي. أثبت Knuth عام 1998 أن طول المسار الخارجي (طول المسار على جميع العقد حيث يوجد كلا الطفلين لكل عقدة موجودة بالفعل) يتم تقليله عندما تقع العقد الخارجية (العقد التي ليس لها أطفال) ضمن مستويين متتاليين من الشجرة. ينطبق هذا أيضًا على المسارات الداخلية حيث يرتبط طول المسار الداخلي خطيًا بطول المسار الخارجي . لأي شجرة عقد، . عندما يكون لكل شجرة فرعية عدد مماثل من العقد، أو على نحو مكافئ يتم تقسيم المصفوفة إلى نصفين في كل تكرار، تقع العقد الخارجية بالإضافة إلى عقد الوالدين الداخلية ضمن مستويين. ويترتب على ذلك أن البحث الثنائي يقلل من عدد المقارنات المتوسطة لأن شجرة المقارنة الخاصة به لها أقل طول مسار داخلي ممكن. [14]
- ^ أظهر Knuth 1998 في نموذج الكمبيوتر MIX الخاص به ، والذي صممه Knuth كتمثيل لجهاز كمبيوتر عادي، أن متوسط وقت تشغيل هذا الاختلاف لإجراء بحث ناجح هو وحدات زمنية مقارنة بوحدات البحث الثنائي العادي. تزداد تعقيدات الوقت لهذا الاختلاف بشكل أبطأ قليلاً، ولكن على حساب تعقيد أولي أعلى. [18]
- ^ أجرى Knuth 1998 تحليلًا رسميًا لأداء الوقت لكلا خوارزميتي البحث. على جهاز كمبيوتر MIX الخاص بـ Knuth ، والذي صممه Knuth كتمثيل لجهاز كمبيوتر عادي، يستغرق البحث الثنائي وحدات متوسطة من الوقت للبحث الناجح، بينما يستغرق البحث الخطي مع عقدة مراقبة في نهاية القائمة وحدات. يتميز البحث الخطي بتعقيد أولي أقل لأنه يتطلب الحد الأدنى من الحساب، ولكنه يتفوق بسرعة على البحث الثنائي في التعقيد. على جهاز كمبيوتر MIX، يتفوق البحث الثنائي على البحث الخطي مع عقدة مراقبة فقط إذا . [14] [23]
- ^ سيؤدي إدخال القيم بترتيب مرتب أو بنمط مفتاح أدنى وأعلى متناوب إلى إنشاء شجرة بحث ثنائية تعمل على تعظيم متوسط وقت البحث وأسوأ الحالات. [28]
- ^ من الممكن البحث في بعض تنفيذات جدول التجزئة في وقت ثابت مضمون. [33]
- ^ يرجع ذلك إلى أن ضبط كل البتات التي تشير إليها وظائف التجزئة لمفتاح معين يمكن أن يؤثر على الاستعلامات الخاصة بالمفاتيح الأخرى التي لها موقع تجزئة مشترك لوظيفة واحدة أو أكثر. [38]
- ^ توجد تحسينات لمرشح بلوم تعمل على تحسين تعقيده أو دعم الحذف؛ على سبيل المثال، يستغل مرشح الوقواق تجزئة الوقواق للحصول على هذه المزايا. [38]
- ^ أي المصفوفات ذات الطول 1، 3، 7، 15، 31 ... [58]
الاستشهادات
- ^ ويليامز جونيور، لويس ف. (22 أبريل 1976). تعديل لطريقة البحث بنصف الفترة (البحث الثنائي). وقائع مؤتمر رابطة مكائن الحوسبة الجنوبية الشرقية الرابع عشر. رابطة مكائن الحوسبة. ص 95-101. doi : 10.1145/503561.503582 . مؤرشف من الأصل في 12 مارس 2017. تم الاسترجاع في 29 يونيو 2018 .
- ^ ab Knuth 1998، §6.2.1 ("البحث في جدول مرتب")، القسم الفرعي "البحث الثنائي".
- ^ باترفيلد ونجوندي 2016، ص. 46.
- ^ كورمن وآخرون. 2009، ص 39.
- ^ Weisstein, Eric W. "البحث الثنائي". MathWorld .
- ^ ab Flores, Ivan; Madpis, George (1 September 1971). "متوسط طول البحث الثنائي للقوائم المرتبة الكثيفة". Communications of the ACM . 14 (9): 602–603. doi : 10.1145/362663.362752 . ISSN 0001-0782. S2CID 43325465.
- ^ abc Knuth 1998، §6.2.1 ("البحث في جدول مرتب")، القسم الفرعي "الخوارزمية ب".
- ^ abcd Bottenbruch, Hermann (1 أبريل 1962). "بنية واستخدام ALGOL 60". مجلة ACM . 9 (2): 161–221. doi : 10.1145/321119.321120 . ISSN 0004-5411. S2CID 13406983.تم وصف الإجراء في الصفحة 214 (§43)، بعنوان "برنامج البحث الثنائي".
- ^ abcdef Knuth 1998، §6.2.1 ("البحث في جدول مرتب")، القسم الفرعي "التاريخ والمراجع".
- ^ أب كاساهارا وموريشيتا 2006، ص 8-9.
- ^ abc Sedgewick & Wayne 2011، §3.1، القسم الفرعي "الرتبة والاختيار".
- ^ abc Goldman & Goldman 2008، ص 461-463.
- ^ Sedgewick & Wayne 2011، §3.1، القسم الفرعي "استعلامات النطاق".
- ^ abcdefghijkl Knuth 1998، §6.2.1 ("البحث في جدول مرتب")، القسم الفرعي "مزيد من التحليل للبحث الثنائي".
- ^ Knuth 1998، §6.2.1 ("البحث في جدول مرتب")، "نظرية ب".
- ^ تشانج 2003، ص 169.
- ^ abc Knuth 1997، §2.3.4.5 ("طول المسار").
- ^ ab Knuth 1998، §6.2.1 ("البحث في جدول مرتب")، القسم الفرعي "تمرين 23".
- ^ Rolfe, Timothy J. (1997). "الاستنتاج التحليلي للمقارنات في البحث الثنائي". نشرة ACM SIGNUM . 32 (4): 15–19. doi : 10.1145/289251.289255 . S2CID 23752485.
- ^ Khuong, Paul-Virak; Morin, Pat (2017). "Array Layouts for Comparison-Based Searching". مجلة الخوارزميات التجريبية . 22. المقال 1.3. arXiv : 1509.05053 . doi :10.1145/3053370. S2CID 23752485.
- ^ Knuth 1997، §2.2.2 ("التخصيص المتسلسل").
- ^ abcd Beame, Paul; Fich, Faith E. (2001). "Optimal bounds for the former problem and related problems". مجلة علوم الحاسب والنظام . 65 (1): 38–72. doi : 10.1006/jcss.2002.1822 .
- ^ Knuth 1998، إجابات التمارين (§6.2.1) لـ "التمرين 5".
- ^ Knuth 1998، §6.2.1 ("البحث في جدول مرتب").
- ^ Knuth 1998، §5.3.1 ("الفرز بالمقارنة الدنيا").
- ^ Sedgewick & Wayne 2011، §3.2 ("جداول الرموز المرتبة").
- ^ Sedgewick & Wayne 2011، §3.2 ("أشجار البحث الثنائية")، القسم الفرعي "الأساليب القائمة على الترتيب والحذف".
- ^ Knuth 1998، §6.2.2 ("البحث عن الشجرة الثنائية")، القسم الفرعي "ولكن ماذا عن أسوأ الحالات؟".
- ^ Sedgewick & Wayne 2011، §3.5 ("التطبيقات")، "أي تنفيذ لجدول الرموز يجب أن أستخدم؟".
- ^ Knuth 1998، §5.4.9 ("الأقراص والطبول").
- ^ Knuth 1998، §6.2.4 ("أشجار متعددة الاتجاهات").
- ^ Knuth 1998، §6.4 ("التجزئة").
- ^ Knuth 1998، §6.4 ("التجزئة")، القسم الفرعي "التاريخ".
- ^ ديتزفيلبينجر ، مارتن ؛ الأماكن القريبة : الأماكن القريبة : ماير أوف دير هايد، فريدهيلم؛ روهنيرت، هانز. تارجان، روبرت إي. (أغسطس 1994). "التجزئة الديناميكية المثالية: الحدود العلوية والسفلية". مجلة SIAM للحوسبة . 23 (4): 738-761. دوى :10.1137/S0097539791194094.
- ^ مورين، بات. "Hash tables" (PDF) . ص. 1. مؤرشف من الأصل (PDF) في 9 أكتوبر 2022. تم الاسترجاع في 28 مارس 2016 .
- ^ Knuth 2011، §7.1.3 ("الحيل والتقنيات الثنائية").
- ^ ab Silverstein, Alan, Judy IV shop manual (PDF) , Hewlett-Packard , ص 80–81، تم أرشفته (PDF) من الأصل في 9 أكتوبر 2022
- ^ ab Fan, Bin; Andersen, Dave G.; Kaminsky, Michael; Mitzenmacher, Michael D. (2014). مرشح الوقواق: أفضل عمليًا من بلوم . وقائع المؤتمر الدولي العاشر لـ ACM حول تجارب وتقنيات الشبكات الناشئة. ص 75-88. doi : 10.1145/2674005.2674994 .
- ^ بلوم، بيرتون هـ. (1970). "المقايضات المكانية/الزمانية في ترميز التجزئة مع الأخطاء المسموح بها". اتصالات جمعية الحوسبة الآلية . 13 (7): 422-426. CiteSeerX 10.1.1.641.9096 . doi :10.1145/362686.362692. S2CID 7931252.
- ^ Knuth 1998، §6.2.1 ("البحث في جدول مرتب")، القسم الفرعي "اختلاف مهم".
- ^ Knuth 1998، §6.2.1 ("البحث في جدول مرتب")، القسم الفرعي "الخوارزمية U".
- ^ موفات وتوربين 2002، ص 33.
- ^ abc Knuth 1998، §6.2.1 ("البحث في جدول مرتب")، القسم الفرعي "البحث عن الاستيفاء".
- ^ Knuth 1998، §6.2.1 ("البحث في جدول مرتب")، القسم الفرعي "تمرين 22".
- ^ بيرل، يهوشوا؛ إيتاي، ألون؛ أفني، حاييم (1978). "البحث عن الاستيفاء - بحث سجل سجل ن". اتصالات ACM . 21 (7): 550-553. doi : 10.1145/359545.359557 . S2CID 11089655.
- ^ abc شازيل، برنارد ؛ ليو، دينج (6 يوليو 2001). الحدود الدنيا للبحث عن التقاطعات والتتابع الكسري في البعد الأعلى. ندوة الجمعية الأمريكية للحاسبات الآلية الثالثة والثلاثون حول نظرية الحوسبة . الجمعية الأمريكية للحاسبات الآلية. ص 322-329. doi :10.1145/380752.380818. ISBN 978-1-58113-349-3تم الاسترجاع بتاريخ 30 يونيو 2018 .
- ^ شازيل، برنارد ؛ ليو، دينج (1 مارس 2004). "الحدود الدنيا للبحث عن التقاطعات والتسلسل الكسري في الأبعاد الأعلى" (PDF) . مجلة علوم الحاسب والنظام . 68 (2): 269-284. CiteSeerX 10.1.1.298.7772 . doi :10.1016/j.jcss.2003.07.003. ISSN 0022-0000. مؤرشف من الأصل (PDF) في 9 أكتوبر 2022. تم الاسترجاع في 30 يونيو 2018 .
- ^ إمام جومه زاده، إحسان؛ كيمبي، ديفيد؛ سينغال، فيكرانت (2016). البحث الثنائي الحتمي والاحتمالي في الرسوم البيانية . ندوة رابطة مكائن الحوسبة الأمريكية الثامنة والأربعون حول نظرية الحوسبة . ص 519-532. arXiv : 1503.00805 . doi :10.1145/2897518.2897656.
- ^ بن أور، مايكل؛ حسيديم، أفيناتان (2008). "المتعلم البايزي هو الأمثل للبحث الثنائي الصاخب (وجيد جدًا في الكم أيضًا)" (PDF) . ندوة أسس علوم الكمبيوتر التاسعة والأربعون . ص 221-230. doi :10.1109/FOCS.2008.58. ISBN 978-0-7695-3436-7. مؤرشف من الأصل (PDF) في 9 أكتوبر 2022.
- ^ بيلك، أندريج (1989). "البحث باحتمالية خطأ معروفة". علوم الكمبيوتر النظرية . 63 (2): 185-202. doi : 10.1016/0304-3975(89)90077-7 .
- ^ Rivest, Ronald L. ; Meyer, Albert R. ; Kleitman, Daniel J. ; Winklmann, K. التعامل مع الأخطاء في إجراءات البحث الثنائي . ندوة ACM العاشرة حول نظرية الحوسبة . doi : 10.1145/800133.804351 .
- ^ بيلك، أندريج (2002). "البحث عن الألعاب التي تحتوي على أخطاء - خمسون عامًا من التعامل مع الكاذبين". علوم الكمبيوتر النظرية . 270 (1-2): 71-109. doi : 10.1016/S0304-3975(01)00303-6 .
- ^ ريني ، ألفريد (1961). “حول مشكلة في نظرية المعلومات”. Magyar Tudományos Akadémia Matematikai Kutató Intézetének Közleményei (باللغة المجرية). 6 : 505-516. السيد 0143666.
- ^ Høyer, Peter; Neerbek, Jan; Shi, Yaoyun (2002). "التعقيدات الكمومية للبحث المنظم والفرز وتميز العناصر". Algorithmica . 34 (4): 429–448. arXiv : quant-ph/0102078 . doi :10.1007/s00453-002-0976-3. S2CID 13717616.
- ^ Childs, Andrew M.; Landahl, Andrew J.; Parrilo, Pablo A. (2007). "Quantum algorithms for the ordered search problem via semidefinite programming". Physical Review A. 75 ( 3). 032335. arXiv : quant-ph/0608161 . Bibcode :2007PhRvA..75c2335C. doi :10.1103/PhysRevA.75.032335. S2CID 41539957.
- ^ جروفر، لوف ك. (1996). خوارزمية ميكانيكية كمية سريعة للبحث في قواعد البيانات . ندوة الجمعية الأمريكية للآلات الحاسبة الثامنة والعشرون حول نظرية الحوسبة . فيلادلفيا، بنسلفانيا. ص 212-219. arXiv : quant-ph/9605043 . doi :10.1145/237814.237866.
- ^ بيترسون، ويليام ويسلي (1957). "المعالجة من أجل التخزين العشوائي". مجلة آي بي إم للأبحاث والتطوير . 1 (2): 130-146. doi :10.1147/rd.12.0130.
- ^ "2 n −1". OEIS A000225 مؤرشف من الأصل في 8 يونيو 2016 على موقع Wayback Machine . تم الاسترجاع في 7 مايو 2016.
- ^ Lehmer, Derrick (1960). "Teaching combinatorial tricks to a computer". Proceedings of Symposia in Applied Mathematics . 10 : 180–181. doi : 10.1090/psapm/010 . ISBN 9780821813102.
- ^ شازيل، برنارد ؛ غويباس، ليونيداس ج. (1986). "التتابع الكسري: الأول. تقنية هيكلة البيانات" (PDF) . ألغوريتميكا . 1 (1-4): 133-162. CiteSeerX 10.1.1.117.8349 . doi :10.1007/BF01840440. S2CID 12745042.
- ^ شازيل، برنارد ؛ غويباس، ليونيداس ج. (1986)، "التتابع الكسري: التطبيقات الثانية" (PDF) ، ألغوريتميكا ، 1 (1-4): 163-191، doi :10.1007/BF01840441، S2CID 11232235
- ^ بنتلي 2000، §4.1 ("تحدي البحث الثنائي").
- ^ باتيس، ريتشارد إي. (1988). "أخطاء الكتب المدرسية في البحث الثنائي". نشرة SIGCSE . 20 : 190–194. doi :10.1145/52965.53012.
- ^ بلوخ، جوشوا (2 يونيو 2006). "إضافي، إضافي - اقرأ كل شيء عنه: جميع عمليات البحث الثنائية وفرز الدمج تقريبًا معطلة". مدونة أبحاث جوجل . مؤرشف من الأصل في 1 أبريل 2016. تم الاسترجاع في 21 أبريل 2016 .
- ^ Ruggieri, Salvatore (2003). "On computing the semi-sum of two integers" (PDF) . Information Processing Letters . 87 (2): 67–71. CiteSeerX 10.1.1.13.5631 . doi :10.1016/S0020-0190(03)00263-1. مؤرشف من الأصل (PDF) في 3 يوليو 2006. تم الاسترجاع في 19 مارس 2016 .
- ^ بنتلي 2000، §4.4 ("المبادئ").
- ^ "bsearch – البحث الثنائي في جدول مرتب". مواصفات قاعدة المجموعة المفتوحة (الطبعة السابعة). المجموعة المفتوحة . 2013. مؤرشف من الأصل في 21 مارس 2016. تم الاسترجاع في 28 مارس 2016 .
- ^ ستروستروب 2013، ص 945.
- ^ "std.range - لغة برمجة D". dlang.org . تم الاسترجاع في 29 أبريل 2020 .
- ^ Unisys (2012)، دليل مرجعي لبرمجة COBOL ANSI-85 ، المجلد 1، ص 598-601
- ^ "ترتيب الحزم". لغة برمجة جو . مؤرشف من الأصل في 25 أبريل 2016. استرجاع 28 أبريل 2016 .
- ^ "java.util.Arrays". توثيق Java Platform Standard Edition 8 . Oracle Corporation . مؤرشف من الأصل في 29 أبريل 2016 . تم الاسترجاع في 1 مايو 2016 .
- ^ "java.util.Collections". توثيق Java Platform Standard Edition 8 . Oracle Corporation . مؤرشف من الأصل في 23 أبريل 2016 . تم الاسترجاع في 1 مايو 2016 .
- ^ "List<T>.BinarySearch method (T)". شبكة مطوري Microsoft . مؤرشف من الأصل في 7 مايو 2016. تم الاسترجاع في 10 أبريل 2016 .
- ^ "NSArray". مكتبة مطوري Mac . Apple Inc. مؤرشف من الأصل في 17 أبريل 2016. تم الاسترجاع 1 مايو 2016 .
- ^ "CFArray". مكتبة مطوري Mac . Apple Inc. مؤرشف من الأصل في 20 أبريل 2016. تم الاسترجاع 1 مايو 2016 .
- ^ "8.6. bisect — Array bisection algorithm". مكتبة بايثون القياسية . مؤسسة بايثون للبرمجيات. مؤرشف من الأصل في 25 مارس 2018. تم الاسترجاع في 26 مارس 2018 .
- ^ فيتزجيرالد 2015، ص 152.
- ^ "شريحة النوع البدائي". مكتبة Rust القياسية . مؤسسة Rust. 2024. تم الاسترجاع في 25 مايو 2024 .
مصادر
- بنتلي، جون (2000). لآلئ البرمجة (الطبعة الثانية). أديسون ويسلي . رقم ISBN 978-0-201-65788-3.
- باترفيلد، أندرو؛ نجوندي، جيرارد إي. (2016). قاموس علوم الكمبيوتر (الطبعة السابعة). أكسفورد، المملكة المتحدة: مطبعة جامعة أكسفورد . رقم ISBN 978-0-19-968897-5.
- تشانج، شي كو (2003). هياكل البيانات والخوارزميات . هندسة البرمجيات وهندسة المعرفة. المجلد 13. سنغافورة: وورلد ساينتيفيك . رقم ISBN 978-981-238-348-8.
- كورمن، توماس إتش ؛ ليسيرسون، تشارلز إي ؛ ريفست، رونالد إل ؛ شتاين، كليفورد (2009). مقدمة إلى الخوارزميات (الطبعة الثالثة). مطبعة معهد ماساتشوستس للتكنولوجيا وماكجرو هيل. رقم ISBN 978-0-262-03384-8.
- فيتزجيرالد، مايكل (2015). مرجع جيب روبي . سيباستوبول، كاليفورنيا: أوريلي ميديا . رقم ISBN 978-1-4919-2601-7.
- جولدمان، سالي أ .؛ جولدمان، كينيث ج. (2008). دليل عملي لهياكل البيانات والخوارزميات باستخدام جافا . بوكا راتون، فلوريدا: مطبعة سي آر سي . رقم ISBN 978-1-58488-455-2.
- كاساهارا، ماساهيرو؛ موريشيتا، شينيتشي (2006). معالجة تسلسل الجينوم على نطاق واسع . لندن، المملكة المتحدة: مطبعة إمبريال كوليدج. رقم ISBN 978-1-86094-635-6.
- كنوث، دونالد (1997). الخوارزميات الأساسية . فن برمجة الكمبيوتر . المجلد 1 (الطبعة الثالثة). ريدنج، ماساتشوستس: أديسون ويسلي بروفيشنال. رقم ISBN 978-0-201-89683-1.
- كنوث، دونالد (1998). الفرز والبحث . فن برمجة الكمبيوتر . المجلد 3 (الطبعة الثانية). ريدنج، ماساتشوستس: أديسون ويسلي بروفيشنال. رقم ISBN 978-0-201-89685-5.
- كنوث، دونالد (2011). الخوارزميات التوافقية . فن برمجة الكمبيوتر . المجلد 4أ (الطبعة الأولى). ريدنج، ماساتشوستس: أديسون ويسلي بروفيشنال. رقم ISBN 978-0-201-03804-0.
- موفات، أليستير؛ توربين، أندرو (2002). خوارزميات الضغط والترميز . هامبورج، ألمانيا: دار النشر الأكاديمي كلوير. doi :10.1007/978-1-4615-0935-6. ISBN 978-0-7923-7668-2.
- سيدجويك، روبرت ؛ واين، كيفن (2011). الخوارزميات (الطبعة الرابعة). أبر سادل ريفر، نيوجيرسي: أديسون ويسلي بروفيشنال. رقم ISBN 978-0-321-57351-3.نسخة الويب المختصرة
;نسخة الكتاب
. - Stroustrup, Bjarne (2013). لغة البرمجة C++ (الطبعة الرابعة). Upper Saddle River, New Jersey: Addison-Wesley Professional. ISBN 978-0-321-56384-2.
روابط خارجية
- قاموس NIST للخوارزميات وهياكل البيانات: البحث الثنائي
- مقارنات ومعايير لمجموعة متنوعة من تطبيقات البحث الثنائي في لغة C أرشيف 25 سبتمبر 2019 على موقع Wayback Machine
