1. 程式人生 > >二分查詢函式彙總

二分查詢函式彙總

問題: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;