三分搜尋法

2021-09-20 14:18:27 字數 1732 閱讀 8200

二分法作為分治中最常見的方法,適用於單調函式,逼近求解某點的值。但當函式是凸性函式時,二分法就無法適用,這時三分法就可以「大顯身手」~~

如圖,類似二分的定義left和right,mid = (left + right) / 2,midmid = (mid + right) / 2; 如果mid靠近極值點,則right = midmid;否則(即midmid靠近極值點),則left = mid;

程式模版如下:

double calc(type a)

void solve(void)}

現根據幾道的oj題目來分析三分法的具體實現。

buaa 1033 easy problem

題意為在一條線段上找到一點,與給定的p點距離最小。很明顯的凸性函式,用三分法來解決。

calc函式即為求某點到p點的距離。

如圖,人左右走動,求影子l的最長長度。

根據圖,很容易發現當燈,人的頭部和牆角成一條直線時(假設此時人站在a點),此時的長度是影子全在地上的最長長度。當人再向右走時,影子開始投影到牆上,當人貼著牆,影子長度即為人的高度。所以當人從a點走到牆,函式是先遞增再遞減,為凸性函式,所以我們可以用三分法來求解。

下面只給出calc函式,其他直接套模版即可。

double calc(double x)

heru 5081 turn the corner 08年哈爾濱regional網路賽

汽車拐彎問題,給定x, y, l, d判斷是否能夠拐彎。首先當x或者y小於d,那麼一定不能。

其次我們發現隨著角度θ的增大,最大高度h先增長後減小,即為凸性函式,可以用三分法來求解。

這裡的calc函式需要比較繁瑣的推倒公式:

s = l * cos(θ) + w * sin(θ) - x;

h = s * tan(θ) + w * cos(θ);

其中s為汽車最右邊的點離拐角的水平距離, h為里拐點最高的距離, θ範圍從0到90。

poj 3301 texas trip

題意為給定n(n <= 30)個點,求出飽含這些點的面積最小的正方形。

有兩種解法,一種為逼近法,就是每次m分角度,求出最符合的角度,再繼續m分,如此進行times次,即可求出較為精確的解。(m 大概取10, times取30即可)

第二種解法即為三分法,首先旋轉的角度只要在0到180度即可,超過180度跟前面的相同的。座標軸旋轉後,座標變換為:

x』 = x * cosa - y * sina;

y』 = y * cosa + x * sina;

至於這題的函式是否是凸性的,為什麼是凸性的,我也無法給出準確的證明,希望哪位路過的大牛指點一下~~

例題更新(2010.5.5)

hdu 3400 line belt

典型的三分法,先三分第一條線段,找到乙個點,然後根據這個點再三分第二條線段即可,想出三分的思路基本就可以過了。

對於求解一些實際問題,當公式難以推導出來時,二分、三分法可以較為精確地求解出一些臨界值,且效率也是令人滿意的。

**自

三分搜尋法

二分法作為分治中最常見的方法,適用於單調函式,逼近求解某點的值。但當函式是凸性函式時,二分法就無法適用,這時三分法就可以 大顯身手 如圖,類似二分的定義left和right,mid left right 2,midmid mid right 2 如果mid靠近極值點,則right midmid 否則...

三分取基法

class stack public stack int size 棧是否已滿 public boolean isfull return false 入棧 public boolean push int val this.elem top val return true 是否為空 public bo...

三分法(洛谷3382 模板 三分法)

如題,給出乙個n次函式,保證在範圍 l,r 內存在一點x,使得 l,x 上單調增,x,r 上單調減。試求出x的值。輸入格式 第一行一次包含乙個正整數n和兩個實數l r,含義如題目描述所示。第二行包含n 1個實數,從高到低依次表示該n次函式各項的係數。輸出格式 輸出為一行,包含乙個實數,即為x的值。四...