八のバイナリ検索

 そして、バイナリ検索を使用する注文シーケンスを持っているか、単調性の問題を。

8.1プログラミングのアイデア:

  1. アレイが設けられている\(A [N-] \) 値の順に昇順に配列要素。変数によって\(ロー、ハイ\)(MID \)\要素が下限検査すべき部分、上限及び中間位置を示します。最初、\(低= 0 ,. 1-N-ハイ= \) 検索\(X \)シーケンスです。
  2. 注文\(MID =(高+低)/ 2 \) (推奨書き込み\(MID =ロー+(高-低)/ 2 \) クロスボーダーの過剰な数を避けるために)
  3. 比較所定値\(X \)\([中間] \)サイズ値:
    • 場合は\(A [MID] X - == \) そして見つけるために成功したエンドを探して。
    • 場合\(A [MID]が> X \) それが所定の値ことを示している\(Xは\)区間にのみ可能である(\低\ SIM半ば1 )\ 内、探索範囲を変更します。注文\(高-MID 1 = \。)、\ (ローが\)値は変わりません。
    • 場合\(A [MIDは<X \) それが所定の値ことを示している\(Xは\)区間にのみ可能である(\ミッド+ 1 \ SIM高い \) 内に、探索範囲を変更します。注文\(低い=ミッド+ 1は、高い\) の値は変わりません。
  4. 現在の変数比較\(低\)\(高\)場合の値を、\(low≤high\)、1,2-ステップが繰り返し実行され、場合\(低>高\) 保留中の配列の不在を示します要素を検索し、検索は失敗します。
  • 例:[] = {10,14,21,38,45,47,53,81,87,99}、ルックアップ47

達成するために、8.2のコード:

int binarysearch(int a[],int num,int x){
    int left=0,right=num-1;//查找区间[left,right]
    while(left<=right){//跳出循环时left=right+1
        int mid = left+(right-left)/2;//避免(left+right)溢出
        if(a[mid] == x)return mid;
        if(a[mid] < x)
            left = mid + 1;
        else
            right = mid - 1;
    }
    return -1;//执行到这一步说明个序列中不存在x
}
  • 非常に効果的な数があるかどうかを調べるが、制限があるために、上記のアルゴリズム。
  • たとえば、規則配列\(A [] = {1,2,2,2,3}、X 2 = \) アルゴリズムリターン指数\(2 \) 右。しかし、私がしたい場合は、\(X \) 指標である国境の左側の、\(1 \)を、または私が欲しい\(X \)指標である右の境界、\(3 \) どのように対処します。

左の境界のための8.2.1のコード

int binarysearch(int a[],int num,int x){//查找数组a,[0,num-1]中比x小的个数
    int left=0,right=num;//查找区间[left,right)
    while(left<right){//跳出循环时left=right
        int mid = left+(right-left)/2;//避免(left+right)溢出
        if(a[mid] >= x) //求左边界我们尽量遇到==x的时候右边界往左移
            right = mid;//注意是左闭右开区间右区间缩小不需要减一
        else
            left = mid + 1;//新的区间不包含a[mid]
    }
    return left;//跳出循环时left指向第一个x的位置
}

8.2.2右境界コードの実装

int binarysearch(int a[],int l,int r,int x){//查找数组a,[l,r]中元素x的位置
    int left=0,right=num;//查找区间[left,right)
    while(left<right){//跳出循环时left=right
        int mid = left+(right-left)/2;//避免(left+right)溢出
        if(a[mid] <= x) //求右边界我们尽量遇到==x的时候左边界往右移
            left = mid+1;//注意是左闭右开区间
        else
            right = mid;//新的区间不包含a[mid]
    }
    return left-1;//注意left要减一,跳出循环时left指向最右x的下一个位置
}

おすすめ

転載: www.cnblogs.com/hbhszxyb/p/12232132.html