二分是乙個比較大的概念,廣義上把東西(可能是問題,區間等等)一分為二都是二分。
這裡講二分查詢。
據說只有10%的程式設計師能寫對二分。雖然二分是乙個簡單的演算法。但是其變化和細節卻並不簡單。
整數二分:
因為mid取整的問題,如果不細心有可能會死迴圈。
所以寫二分查詢需要仔細考慮 答案在開/閉區間?mid向上/下取整?迴圈結束條件?這些選擇的取捨不同會導致二分的寫法不同,沒有說必須哪一種是正確的。掌握自己喜歡的寫法即可。
這裡的二分保證答案必須在[l,r]閉區間,迴圈借宿條件為(l==r),答案下標為 l 。
**如下,其中細節還是值得細細琢磨。
#include#include#include
using
namespace
std;
const
int n=100000
;int
n,q,a[n],l,r;
intmain()
cout
/查詢滿足<=q的最後乙個數(x或x的前驅)
scanf("
%d",&q);
l=1,r=n;
while (lcout
}
浮點數二分:
因為不用考慮取整的問題,所以浮點數二分相當好些。
注意精度問題就可以了。
double eps=1e-5;
while (l+eps三分求單峰函式極值:
當這個函式可能是單調函式時(極值點在端點), 三分演算法無法到達端點位置, 所以要特判一下兩個端點。
intlm, rm;
while(l
二分查詢模板
二分查詢也稱折半查詢 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 對...