二分搜尋 二分法及運用

2021-10-23 01:13:46 字數 2137 閱讀 7573

二分法查詢:通過不斷縮小解存在的範圍,在有序陣列中查詢特定元素的搜尋演算法。

經常可見 二分法 與其他演算法結合的題目

(1)首先,從陣列的中間開始搜尋,如果該位置的值剛好是目標,則表示找到,結束搜尋。

(2)如果第一步的搜尋到的值大於目標,則把陣列分成兩半,在陣列右邊區域查詢,然後重複步驟(1)的操作。

如果第一步的搜尋到的值小於目標,則把陣列分成兩半,在陣列左邊區域查詢,然後重複步驟(1)的操作。

(3)如果到陣列分成僅剩乙個元素還是沒找到,就表示查詢不到。

樸素的從左到右查詢,時間是o(n),二分法查詢的時間 o(logn)。

//二分

int l=

0,r=n;

// l:左邊 r:右邊

while

(l<=r)

if(a[mid]

> k)

else

}

多好時候,我都是寫成大概上面那樣, l ,r 是陣列的起始下標和尾下標。但是,有些題,由於題目的特性,上面寫法做不出來(也可能是我太弱55)

比如下面這道:

通常的那種寫法每次是下標向前移或向後移,是用在求乙個數是否在陣列裡面出現

而這種題是要求實數的,而且數值並沒有在陣列裡面出現。

那怎麼辦? 應該把l ,r當成是答案的範圍,而後用二分求。

寫出來大概是這樣的:

#include

#include

using

namespace std;

#include

const

int maxn =

10005

;int n,k;

double a[maxn]

;boolf(

double x)

return cnt>=k;

}int

main()

// 二分

double l =

0,r = len;

for(

int i=

0;i<

100;i++

)else

}// cout

("%.2f"

,l);

return0;

}

這種二分,l,r不再是數值的左右標,而是目標答案的左右範圍 ,

// 二分

int l =-1

,r = n;

while

(r-l>1)

int mid =

(l+r)/2

;if(a

(mid)

>=k)

else

} cout<

類似最大化最小值,最小化最大值,最大化平均值等,通常都用到二分搜尋,

比如下面這種, 其他不用怎麼說了吧,大致差不多。

二分法,二分搜尋

二分法是乙個應用很廣泛的演算法 好吧,剛說出這句話的時候,我查了一下資料,發現我了解的應用寥寥無幾.ok,既然不知道,那就下次補充把。咱們直接進入主題。二分法 bisection method 是一種方程式根的近似值求法。演算法 若要求已知函式f x 0的值則 1.先找出乙個區間 a,b 使得f a...

搜尋 二分法

input 待搜尋目標整數,目標陣列 output 找到目標整數的索引,找不到則 1 constraints 目標陣列有序排列 公升降序 二分法搜尋思想 舉例說明 你是個摸牌高手,不用掀開麻將只需用手摸就能摸出牌面,桌面扣著80個麻將牌,不同的是麻將上刻的是80個1到500的公升序不連續數字,形如 ...

C 二分法查詢,遞迴二分法

用二分法來求需要查詢的值.includeusing namespace std 查詢key元素是否存在 int findkey const int buf 100 const int ilen,const int key else right left mid 1 查詢失敗 return 1 查詢k...