検索アルゴリズム-二分検索


テーブル内の要素が整列していると仮定し、テーブルの中間位置のキーワードを必要なキーワードと比較して等しくすると成功し、そうでなければ前後の2つのサブテーブルに分けられ、必要な値が中間要素より大きい場合は後半で検索し、そうでなければ前半で検索します.クエリーが結果になるまで、上記の手順を繰り返します.
 
利点:比較回数が少なく、スピードが速い
欠点:調査対象テーブルが整列テーブルであることが要求されます.
 
時間複雑度:O(h)=O(log 2 n)
 
c/c++コード実装:
方法1:ループ
 
int binsearch(SeqList *R,int n,KeyType K)

{

    int low=0;

    int higt=n-1;

    int mid;



    while(low<=high){



    if(K==R[low].key)

        return low;

    if(K==R[high].key)

        return high;

    mid=low+(high-low)/2;

    /*  (low+high)/2         

    (       low+high                     ,

      ,      /2          , low+((high-low)/2)

           */



        if(K==R[mid].key)

        return mid;



        if(K>R[mid].key){

            low=mid+1;

        }

        else

            high=mid-1;

    }



    if(low>high)

        return -1;

}

このコードはmidのオーバーフロー問題のような多くの問題に気づいて、とても注意しています.
中間だけを判断するのではなく、頭の尾を判断することもあります.これにより効率が向上する.
 
方法2:再帰
#include 

using namespace std;



int a[10]={1,2,3,4,5,6,7,8,9,10};

int k;

int binsearch(int low, int high){

    int mid=low+(high-low)/2;



    if(low>high)

        return -1;



    if(a[low]==k)

        return low;

    else if(a[high]==k)

        return high;



    else if(a[mid]==k)

        return mid;

    else{

        if(k>=a[mid])

            binsearch(mid+1, high);

        else

            binsearch(low, mid-1);

    }

}



int main(){

    cin>>k;

    cout<