二分查詢
基於分治策略的一種查詢方法, 時間複雜度 $ o(log_) $是用於解決單調有序問題,縮小問題規模
演算法步驟:
**演示:
int
binary_search1
(int
*num,
int n,
int x)
else
}return-1
;}
二分問題模型:
11110000問題:
首先我們需要明確我們的目的是為了不斷縮小問題規模,也就是說最終答案已經要包含在我們的問題區間內。
像二分法一樣我們進行二分查詢,我們通過中間指標指向的值來縮小問題區間,如果我們發現中間值為0,那麼我們的右指標可以放心大膽的跨度到中間指標前一位。如若我們發現中間值為1,那我們不能確定這個值是否為最終結果,那我們只能將左指標指向中間指標的位置。
我們需要注意全1並為偶數的情況, 如若現在序列為 11, 也就是序列中間指標都指向中間靠左的元素,那麼右指標將永遠不會更改,最終造成死迴圈
解決方法: $中間指標左指標右指標 中間指標 = \frac $
每次將中間指標指向中間靠右的元素將會解決這個問題。
**演示:
int
binary_search2
(int
*num,
int n,
int x)
else
}return head;
}
00001111問題:
和上述問題我們要達到的目的一樣也是為了不斷的縮小問題規模。
那麼求解問題的方法和求解00001111也是不禁相同。當我們發現中間值為0時,我們知道中間值不滿足條件,那麼我們的左指標可以放心大膽的向右前進,左指標 = 中間指標 + 1。當我們發現中間值為1時,我們不能保證這個是問題答案,那我們右指標只能小心翼翼的向左前進。右指標 = 中間指標。
由於我們就要取靠左的值所以正常求解即可
**演示:
int
binary_search3
(int
*num,
int n,
int x)
else
}return head == n ?-1
:head;
}
三分查詢
適用於解決單峰問題,要保證l與r在問題答案的左右兩側。
**演示:
#include
#include
#define eps 1e-6
doublef(
double x,
double a,
double b,
double c)
double
three_point_search
(double a,
double b,
double c)
while
(fabs
(tail - head)
> eps)
else
}return head;
}int
main()
}
二分三分法
x 待查詢的值,caculate 所要查詢的函式,這裡單調遞增。double low 區間下界 high 區間上界 mid while high low 1.0e 6 有區間下界left,區間上界right,mid為中點,midmid為靠近right的四等分點。即 mid left right 2 ...
二分三分法 (二)
最近剛學了二分法,還沒有學三分,所以在上課之前,把三分總體的預習了一下,感覺三分應該和二分大體的思路還是一致的,二分的思路是在乙個單調的數列基礎上,每次都求中間值,然後不斷縮小,最後求出解,這樣可以把時間壓縮到最小化。然而三分主要運用的方面是針對於數列是凹函式或者凸函式,先將乙個區間分成3份,每份佔...
ACM學習筆記(1)二分法 三分法
這裡是acm學習筆記 1 二分法 三分法。每次學習筆記都將會以思維導圖等多種靈活形式展示出來,這裡面的部落格和習題都是屬於精選,並且會不定時更新完善筆記。acm學習筆記 0 總綱要 二分法 一 二分法的基本思想 模板 整數快速冪 快速冪取模 模板題p1226 模板 快速冪 取餘運算 矩陣快速冪總結 ...