二分法與三分法

2021-08-25 02:39:56 字數 1872 閱讀 8961

二分查詢

基於分治策略的一種查詢方法, 時間複雜度 $ 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 模板 快速冪 取餘運算 矩陣快速冪總結 ...