二分與三分查詢

2021-08-16 19:02:44 字數 970 閱讀 5607

一、二分查詢

二分查詢很常見了,放乙個模板就溜。

時間複雜度 o(logn),log以2為底。

(最後得到的是可行域的閉區間 [l,r] )

while(r>l)

二、三分查詢三分查詢用於查詢乙個凸(凹)函式的極值點。

時間複雜度 o(2*logn),log以3為底。

對於乙個區間[l,r],先取中點mid=(l+r)/2,再取[mid,r]的中點mid2=(mid+r)/2;

然後比較f(mid)與f(mid2);

若f(mid) > f(mid2):r=mid2;

若f(mid) < f(mid2):l=mid;

正確性證明:

①若f(mid) > f(mid2),則極值點x在mid2左側。

反證:若x在mid2右側,則mid與mid2均在x左側,由單調性得f(mid) < f(mid2),矛盾;

②若f(mid) < f(mid2),則極值點x在mid右側。

反證:若x在mid左側,則mid與mid2均在x右側,由單調性得f(mid) > f(mid2),矛盾;

三分模板:

①while(l1)

if(f(l)>f(r)) return l;

else return r;

②while(lmid=(l+r)/2;

mid2=(mid+r+1)/2;

if(f(mid)>f(mid2)) r=mid2-1;

else l=mid+1;

}return l;

二分查詢,三分查詢

今天看分治法那塊,裡面提到了二分搜尋,想想好多年沒寫這個簡單的程式了,話說當年第乙個真正意義上理解的是三分查詢,即二分搜尋的拓展,所以根據分治法的思想,重新寫了二分搜尋,三分搜尋這兩個程式,突然回憶起來,當初對m l r 2,竟一點沒有懷疑過,那些分割點是怎麼求出來的,要提醒像我一樣初寫程式的朋友,...

二分與三分

其實二分,三分與分治的思想差不多,都是對乙個問題的分段操作 前提為有序 qwq 二分法,在乙個單調有序的集合或函式中查詢乙個解,每次分為左右兩部分,判斷解在哪個部分中並調整上下界,直到找到目標元素,每次二分後都將捨棄一半的查詢空間,因此效率很高。例如,對於在實數區間 l,r 內遞增的連續函式f x ...

二分與三分

分值的思想 opj用longlong include include include include include using namespace std long long n long long a1 100005 int m long long a2 10005 int main scanf...