二分查詢模板

2022-09-01 11:51:10 字數 1158 閱讀 2753

一、查詢精確值

從乙個有序陣列中找到乙個符合要求的精確值(如猜數遊戲)。如查詢值為key的元素下標,不存在返回-1。

//這裡是left<=right。

//考慮這種情況:如果最後剩下a[i]和a[i+1](這也是最容易導致導致死迴圈的情況)首先mid = i,

//如果a[mid] < key,那麼left = mid+1 = i +1,如果是小於號,則a[i + 1]不會被檢查,導致錯誤

int left = 1,right = n;

while(left <= right)

return -1;

二、查詢符合條件的位置

1.查詢第乙個≥key的元素的位置

設a為單調不減整數系列,在系列a中查詢第乙個≥key的數的位置。

int left=1,right=n+1;//為什麼right的初始值為n+1,因為存在著key比所有元素都大的情況

int lower_bound(int a,int left,int right,int key)

return left;

}

2.查詢最後乙個≤key的元素的位置

設系列a為單調不減整數系列,在系列a中查詢最後乙個≤key的數的位置。

int left=0,right=n;//left和right邊界初始區間為[0,n],因為key有可能比所有的數都更小

int last_bound(int a,int left,int right,int key){

int mid;

while(left第二種模板比較複雜,它涉及到兩種縮小區間的形式。

形式一:right=mid,left=mid+1,取中間值時mid=(left+right)/2;

形式二:left=mid,right=mid-1,取中間值時mid=(left+right+1)/2;

三、總結

為什麼第二種查詢的迴圈跳出條件是left

二分查詢模板

二分查詢也稱折半查詢 binary search 它是一種效率較高的查詢方法。演算法思路 假設目標值在閉區間 l,r 中,每次將區間長度縮小一半,當l r時,我們就找到了目標值。模板一當區間 l,r 的更新操作是r mid l mid 1 時,計算mid時不需要加1。int bsearch 1 in...

二分查詢模板

例如陣列中查詢乙個數 二分查詢的前提是整個陣列是有序的 模板 int a n int l 0,r n 1 int mid,key while l r 另外還有一些二分查詢函式 a.函式模板 binary search arr,arr size indx c.函式功能 在陣列中以二分法檢索的方式查詢,...

二分查詢模板

二分查詢模板總共有兩個 將區間分為 l,mid l,mid l,mid mid 1,r mid 1,r mid 1 r 時,如下 while l r else 將區間分為 l,mid 1 l,mid 1 l,mid 1 mi d,r mid,r mid,r 時,如下 while l r else 對...