二分查詢函式彙總
阿新 • • 發佈:2018-12-20
問題:A心裡想一個1-1000之間的數,B來猜,可以問問題,A只能回答是或否。怎麼猜才能問的問題次數最少?
思路:是1嗎?是2嗎?…是999嗎? 平均要問500次 大於500嗎?大於750嗎?大於625嗎? …每次縮小猜測範圍到上次的一半
只需要 10次
二分查詢函式
寫一個函式BinarySeach,在包含size個元素的、從小到大排序的int陣列a裡查詢元素p,如果找到,則返回元素下標,如果找不到,則返回-1。要求複雜度O(log(n))
下面附核心程式碼:
int BinarySearch(int a[],int size,int p)
{
int L = 0; //查詢區間的左端點
int R = size - 1; //查詢區間的右端點
while( L <= R) { //如果查詢區間不為空就繼續查詢
int mid = L+(R-L)/2; //取查詢區間正中元素的下標
if( p == a[mid] )
return mid; else if( p > a[mid])
L = mid + 1; //設定新的查詢區間的左端點
else
}
R = mid - 1; //設定新的查詢區間的右端點
return -1;
} //複雜度O(log(n))
寫一個函式LowerBound,在包含size個元素的、從小到大排序的int陣列a裡查詢比給定整數p小的,下標最大的元素。找到則返回其下標,找不到則返回-1
int LowerBound(int a[],int size,int p) //複雜度O(log(n))
{
int L = 0; //查詢區間的左端點
int R = size - 1; //查詢區間的右端點
int lastPos = -1; //到目前為止找到的最優解
while( L <= R) { //如果查詢區間不為空就繼續查詢
int mid = L+(R-L)/2; //取查詢區間正中元素的下標
if(a[mid]>= p)
R = mid - 1;
else {
}
}
lastPos = mid; L = mid+1;
return lastPos;
}
二分查詢函式
注意: int mid = (L+R)/2; //取查詢區間正中元素的下標
為了防止 (L+R)過大溢位:
int mid = L+(R-L)/2;