二分查詢寫法總結(找元素,定區間,求精度)

2021-08-07 10:51:11 字數 2139 閱讀 9520

二分查詢採用逐步縮小範圍的思維方法,它遵循分治三步法,把院序列劃分成元素個數盡量接近的兩個子串行,然後遞迴查詢,時間複雜度為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 即...