البحث الأسي
في علم الحاسوب ، يُعد البحث الأسي (ويُسمى أيضًا البحث المضاعف أو البحث المتسارع أو بحث ستروزيك ) [ 1 ] خوارزميةً ابتكرها جون بنتلي وأندرو تشي-تشيه ياو عام 1976، للبحث في قوائم مرتبة غير محدودة/لا نهائية. [ 2 ] توجد طرق عديدة لتنفيذ هذه الخوارزمية، وأكثرها شيوعًا هو تحديد نطاق يقع فيه مفتاح البحث وإجراء بحث ثنائي ضمن هذا النطاق. يتطلب هذاالوقت، أينهو موضع مفتاح البحث في القائمة، إذا كان مفتاح البحث موجودًا في القائمة، أو الموضع الذي يجب أن يكون فيه مفتاح البحث، إذا لم يكن مفتاح البحث موجودًا في القائمة.
يمكن استخدام البحث الأسي أيضًا للبحث في القوائم المحدودة. بل قد يتفوق البحث الأسي على عمليات البحث التقليدية في القوائم المحدودة، مثل البحث الثنائي، عندما يكون العنصر المطلوب البحث عنه قريبًا من بداية المصفوفة. وذلك لأن البحث الأسي سيعمل فيالوقت، أينيمثل فهرس العنصر الذي يتم البحث عنه في القائمة، بينما يتم تشغيل البحث الثنائي فيالوقت، أينيمثل عدد العناصر في القائمة.
الخوارزمية
يُتيح البحث الأسي البحث في قائمة مُرتبة وغير محدودة عن قيمة مُدخلة مُحددة (مفتاح البحث). تتكون الخوارزمية من مرحلتين. تُحدد المرحلة الأولى نطاقًا يقع فيه مفتاح البحث إذا كان موجودًا في القائمة. في المرحلة الثانية، يُجرى بحث ثنائي على هذا النطاق. في المرحلة الأولى، وبافتراض أن القائمة مُرتبة تصاعديًا، تبحث الخوارزمية عن الأس الأول ، j ، حيث تكون القيمة 2j أكبر من مفتاح البحث. تُصبح هذه القيمة، 2j ، الحد الأعلى للبحث الثنائي، بينما يُمثل الأس السابق للعدد 2، 2j - 1 ، الحد الأدنى للبحث الثنائي. [ 3 ]
// تُعيد موضع المفتاح في المصفوفة arr ذات الطول size. template < typename T > int exponential_search ( T arr [], int size , T key ) { if ( size == 0 ) { return NOT_FOUND ; }int bound = 1 ; while ( bound < size && arr [ bound ] < key ) { bound *= 2 ; }return binary_search ( arr , key , bound / 2 , min ( bound , size )); }في كل خطوة، تقارن الخوارزمية قيمة مفتاح البحث بقيمة المفتاح عند فهرس البحث الحالي. إذا كان العنصر عند الفهرس الحالي أصغر من مفتاح البحث، تُكرر الخوارزمية العملية، وتنتقل إلى فهرس البحث التالي بمضاعفته، ثم تحسب القوة التالية للعدد 2. [ 3 ] إذا كان العنصر عند الفهرس الحالي أكبر من مفتاح البحث، فإن الخوارزمية تعلم الآن أن مفتاح البحث، إن وُجد في القائمة، يقع في الفترة المُشكّلة من فهرس البحث السابق (2j - 1 ) وفهرس البحث الحالي (2j ) . بعد ذلك، يُجرى البحث الثنائي، وتكون النتيجة إما فشلًا إذا لم يكن مفتاح البحث موجودًا في القائمة، أو موضع مفتاح البحث في القائمة.
أداء
المرحلة الأولى من الخوارزمية تأخذالوقت، أينيمثل هذا الفهرس الذي سيُوضع فيه مفتاح البحث في القائمة. وذلك لأنه عند تحديد الحد الأعلى للبحث الثنائي، يتم تنفيذ حلقة while بدقةمرات. بما أن القائمة مرتبة، بعد مضاعفة فهرس البحثفي بعض الأحيان، ستكون الخوارزمية عند فهرس بحث أكبر من أو يساوي i كماوبالتالي، فإن المرحلة الأولى من الخوارزمية تأخذوقت.
يأخذ الجزء الثاني من الخوارزمية أيضًاالوقت. بما أن المرحلة الثانية هي ببساطة بحث ثنائي، فإنها تستغرق وقتًا.أينيمثل حجم الفترة التي يتم البحث فيها. سيكون حجم هذه الفترة 2j - 2j - 1 حيث، كما هو موضح أعلاه، j =هذا يعني أن حجم الفترة التي يتم البحث فيها هو 2 log i - 2 log i - 1 = 2 log i - 1. وهذا يعطينا زمن تشغيل قدره log (2 log i - 1 ) = log ( i ) - 1 =.
وهذا يعطي الخوارزمية وقت تشغيل إجمالي، يتم حسابه عن طريق جمع أوقات تشغيل المرحلتين، وهو:+= 2=.
البدائل
اقترح بنتلي وياو عدة تعديلات على البحث الأسي. [ 2 ] تتضمن هذه التعديلات إجراء بحث ثنائي، بدلاً من البحث الأحادي، عند تحديد الحد الأعلى للبحث الثنائي في المرحلة الثانية من الخوارزمية. يؤدي هذا إلى تقسيم المرحلة الأولى من الخوارزمية إلى جزأين، مما يجعل الخوارزمية ثلاثية المراحل إجمالاً. تحدد المرحلة الأولى الجديدة قيمةً.كما كان الحال من قبل، بحيثأكبر من مفتاح البحث وأقل من مفتاح البحث. سابقًا،تم تحديدها بطريقة أحادية عن طريق حساب القوة التالية للعدد 2 (أي إضافة 1 إلى j ). في التباين، يُقترح أنيتم مضاعفة العدد بدلاً من ذلك (على سبيل المثال، القفز من 2 2 إلى 2 4 بدلاً من 2 3 ). الأولبحيثعندما تكون القيمة أكبر من مفتاح البحث، فإنها تشكل حدًا أعلى أقل دقة بكثير من ذي قبل. بمجرد أن يحدث هذاإذا تم العثور على العنصر المطلوب، ينتقل البرنامج إلى مرحلته الثانية ويتم إجراء بحث ثنائي على الفترة التي تشكلها الخوارزمية.ومما يُعطي قيمة الأس الأعلى الأكثر دقة j . من هنا، تُجري المرحلة الثالثة من الخوارزمية البحث الثنائي على الفترة 2j - 1 و2 j ، كما في السابق. أداء هذا التغيير هو.
قام بنتلي وياو بتعميم هذا التباين إلى تباين يتم فيه تنفيذ أي عدد، k ، من عمليات البحث الثنائي خلال المرحلة الأولى من الخوارزمية، مما ينتج عنه تباين البحث الثنائي المتداخل k . لا يتغير وقت التشغيل التقاربي بالنسبة لهذه التباينات، حيث يعمل فيالوقت، كما هو الحال مع خوارزمية البحث الأسي الأصلية.
كذلك، يمكن الحصول على بنية بيانات ذات نسخة مُحكمة من خاصية الإصبع الديناميكي عند استخدام نتيجة البحث الثنائي المتداخل k المذكورة أعلاه على مصفوفة مُرتبة. [ 4 ] باستخدام هذه البنية، يكون عدد المقارنات التي تُجرى أثناء البحث هو log ( d ) + log log ( d ) + ... + O (log * d )، حيث d هو الفرق في الرتبة بين آخر عنصر تم الوصول إليه والعنصر الحالي الذي يتم الوصول إليه.
التطبيقات
خوارزمية تعتمد على زيادة نطاق البحث بشكل أُسّي تحل مشكلة المحاذاة الزوجية العالمية لـ، أينهو طول التسلسلات وهي مسافة التحرير بينهما. [ 5 ] [ 6 ]
انظر أيضاً
مراجع
- ↑ بايزا-ياتس، ريكاردو ؛ سالينجر، أليخاندرو (2010)، "خوارزميات التقاطع السريع للمتتاليات المرتبة"، في إيلوما، تابيو؛ مانيلا، هيكي ؛ أوربونين، بيكا (محررون)، الخوارزميات والتطبيقات: مقالات مهداة إلى إيسكو أوكونين بمناسبة عيد ميلاده الستين ، سلسلة محاضرات في علوم الحاسوب، المجلد 6060، سبرينغر، الصفحات 45-61 ، Bibcode : 2010LNCS.6060...45B ، doi : 10.1007/978-3-642-12476-1_3 ، ISBN 9783642124754.
- بنتلي ، جون ل .؛ ياو، أندرو س. (1976). "خوارزمية شبه مثالية للبحث غير المحدود". رسائل معالجة المعلومات . 5 ( 3): 82-87 . doi : 10.1016/0020-0190(76)90071-5 . ISSN 0020-0190 . OSTI 1318069 .
- 1 2 جونسون، هاكان (19 أبريل 2011). "البحث الثنائي الأسي" . مؤرشف من الأصل في 1 يونيو 2020. تم الاطلاع عليه في 24 مارس 2014 .
- ↑ أندرسون، آرني؛ ثورب، ميكيل (2007). "المجموعات المرتبة الديناميكية مع أشجار البحث الأسية". مجلة ACM . 54 (3): 13. arXiv : cs/0210006 . doi : 10.1145/1236457.1236460 . ISSN 0004-5411 . S2CID 8175703 .
- ↑ أوكونين، إيسكو (مارس 1985). "إيجاد أنماط تقريبية في السلاسل النصية" . مجلة الخوارزميات . 6 (1): 132-137 . doi : 10.1016/0196-6774(85)90023-9 . ISSN 0196-6774 .
- ↑ Šošić, Martin; Šikić, Mile (2017). "Edlib: مكتبة AC/C++ لمحاذاة التسلسل السريعة والدقيقة باستخدام مسافة التحرير" . المعلوماتية الحيوية . 33 (9): 1394–1395 . bioRxiv 10.1101/070649 . doi : 10.1093/bioinformatics/btw753 . PMC 5408825. PMID 28453688 .
- خوارزميات البحث
