二分法查詢:通過不斷縮小解存在的範圍,在有序陣列中查詢特定元素的搜尋演算法。
經常可見 二分法 與其他演算法結合的題目
(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...