二分查詢採用逐步縮小範圍的思維方法,它遵循分治三步法,把院序列劃分成元素個數盡量接近的兩個子串行,然後遞迴查詢,時間複雜度為o(logn),但一般二分查詢不寫成遞迴的形式,而是用迴圈迭代的形式。1.要實現在乙個線性序列的[x
,y) [x,
y)區間內查詢是否存在等於key值的元素,存在返回下標位置;不存在則返回-1
int binary_search(int* a, int x, int y, int key)
return -1;
}
2.線性序列中可能存在多個key值,分下面兩種要求討論:
int lower_bound(int* a, int x, int y, int key)
return x;
}
即實現了stl中同名函式lower_bound的功能,查詢序列中滿足插入key值而序列仍然有序的第乙個位置。
int upper_bound(int* a, int x, int y, int key)
return x;
}
即實現了stl中同名函式upper_bound的功能,查詢序列中滿足插入key值而序列仍然有序的最後乙個位置。
拓展說明:利用upper_bound - lower_bound可以得到序列中與key值相等的元素的個數
一般用於使結果達到某一精度而不斷地進行二分,也有兩種寫法,一種是指定迴圈次數作為終止條件,1次迴圈可以把區間的範圍縮小一半,100次的迴圈則可以達到2−
100≈10−
30 2
−100≈10
−30
的精度範圍,這樣做應該是沒有問題的,而且不會陷入無限迴圈;另一種是指定精度為eps作為終止條件,但是這樣做需要注意,如果eps取得太小了,就有可能因為浮點小數精度的原因導致陷入死迴圈。1.指定精度
#define eps 1e-8
double binary_search(double l, double r)
return mid;
}
2.指定迴圈次數
double binary_search(double l, double r)
return mid;
}
#include
#include
#include
using
namespace
std;
const
int maxn=10;
int a[maxn];
int binary_search(int* a, int x, int y, int key)
return -1;
}int lower_bound(int* a, int x, int y, int key)
return x;
}int upper_bound(int* a, int x, int y, int key)
return x;
}int main()
sort(a,a+maxn);
cout
<
cin>>key;
cout
<
for(int i=0; icout
}cout
<
for(int i=0; icout
}cout
printf("第乙個等於%d的位置下標: %d\n",key,lower_bound(a,0,maxn,key));
printf("最後乙個等於%d的位置的後面乙個位置下標: %d\n",key,upper_bound(a,0,maxn,key));
printf("序列中%d的個數: %d\n",key,upper_bound(a,0,maxn,key)-lower_bound(a,0,maxn,key));
注:參考《演算法競賽入門經典》
二分查詢區間總結
筆者本以為二分查詢非常簡單,掌握一種會用不就差不多了,並不知道區間還分那麼多種,現在總結一下。比較一下其中的不同之處。為了更詳細乙個 閉區間 l,r int binary search int a,int size,int p else 左閉右開 l,r int binary search int ...
二分寫法總結
二分答案 浮點數二分 首先二分的思想不難,問題在於整數二分的時候如果沒有處理好二分的區間,會導致死迴圈的情況,比如下面這種二分求上界的寫法 int binarysearch int l,int r return l 這樣寫到最後二分的區間是 l,l 1 且如果check l 返回的是true,那麼將...
二分查詢元素求比較次數
在順序表 中,用二分法查詢關鍵碼 20需做 次關鍵字比較。解 數值 12 15 17 20 24 30 38 43 45 51 52 下標 0 1 2 3 4 5 6 7 8 9 10 以上一共11個數,按下標則是0 10,以下按照步驟進行 1 mid left right 2 0 10 2 5 即...