そして、バイナリ検索を使用する注文シーケンスを持っているか、単調性の問題を。
8.1プログラミングのアイデア:
- アレイが設けられている\(A [N-] \) 、値の順に昇順に配列要素。変数によって\(ロー、ハイ\)と(MID \)\要素が下限検査すべき部分、上限及び中間位置を示します。最初、\(低= 0 ,. 1-N-ハイ= \) 、検索\(X \)シーケンスです。
- 注文\(MID =(高+低)/ 2 \) 。(推奨書き込み\(MID =ロー+(高-低)/ 2 \) 、クロスボーダーの過剰な数を避けるために)
- 比較所定値\(X \)と\([中間] \)サイズ値:
- 場合は\(A [MID] X - == \) 、そして見つけるために成功したエンドを探して。
- 場合\(A [MID]が> X \) 、それが所定の値ことを示している\(Xは\)区間にのみ可能である(\低\ SIM半ば1 )\ 内、探索範囲を変更します。注文\(高-MID 1 = \。)、\ (ローが\)値は変わりません。
- 場合\(A [MIDは<X \) 、それが所定の値ことを示している\(Xは\)区間にのみ可能である(\ミッド+ 1 \ SIM高い \) 内に、探索範囲を変更します。注文\(低い=ミッド+ 1は、高い\) の値は変わりません。
- 現在の変数比較\(低\)と\(高\)場合の値を、\(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的下一个位置
}