البحث الثنائي الموحد

يُعدّ البحث الثنائي الموحد تحسينًا لخوارزمية البحث الثنائي الكلاسيكية . نُشر لأول مرة بواسطة دونالد كنوث في كتابه "فن برمجة الحاسوب" ، الذي نسب فكرته إلى أشوك ك. تشاندرا . [ 1 ] يستخدم هذا البحث جدول بحث لتحديث فهرس مصفوفة واحد، بدلاً من حساب نقطة المنتصف بين حدّين أعلى وأدنى في كل تكرار؛ ولذلك، فهو مُحسَّن للبنى المعمارية (مثل MIX الخاص بكنوث ) التي

  • البحث في الجدول أسرع عمومًا من الجمع والإزاحة،
  • سيتم إجراء العديد من عمليات البحث على نفس المصفوفة، أو على عدة مصفوفات من نفس الطول.

تنفيذ بلغة C

تبدو خوارزمية البحث الثنائي الموحد على هذا النحو عند تنفيذها بلغة C.

#define LOG_N 4static int delta [ LOG_N ];void make_delta ( int N ) { int power = 1 ; int i = 0 ;do { int half = power ; power <<= 1 ; delta [ i ] = ( N + half ) / power ; } while ( delta [ i ++ ] != 0 ); }int unisearch ( int * a , int key ) { int i = delta [ 0 ] - 1 ; /* نقطة منتصف المصفوفة */ int d = 0 ;بينما ( 1 ) { إذا ( المفتاح == أ [ i ]) { أرجع i ؛ } وإلا إذا ( دلتا [ d ] == 0 ) { أرجع -1 ؛ } وإلا { إذا ( المفتاح < أ [ i ]) { i -= دلتا [ ++ d } وإلا { i += دلتا [ ++ d } } } }/* مثال على الاستخدام: */ #define N 10int main ( void ) { int a [ N ] = { 1 , 3 , 5 , 6 , 7 , 9 , 14 , 15 , 17 , 19 };make_delta ( N );for ( int i = 0 ; i < 20 ; ++ i ) printf ( "%d موجود في الفهرس %d \n " , i , unisearch ( a , i ));return 0 ; }

مراجع

  1. كنوت، دونالد إي. (1998). فن برمجة الحاسوب، المجلد 3: الفرز والبحث (الطبعة الثانية  ). ريدينغ، ماساتشوستس: أديسون-ويسلي. ص  422. ISBN 0-201-89685-0.