三分法查詢

2021-10-05 18:26:58 字數 1391 閱讀 6730

我們都知道 二分查詢 適用於單調函式中逼近求解某點的值。

如果遇到凸性或凹形函式時,可以用三分查詢求那個凸點或凹點。

下面的方法應該是三分查詢的乙個變形。

如圖所示,已知左右端點l、r,要求找到白點的位置。

思路:通過不斷縮小 [l,r] 的範圍,無限逼近白點。

做法:先取 [l,r] 的中點 mid,再取 [mid,r] 的中點 mmid,通過比較 f(mid) 與 f(mmid) 的大小來縮小範圍。

當最後 l=r-1 時,再比較下這兩個點的值,我們就找到了答案。

1、當 f(mid) > f(mmid) 的時候,我們可以斷定 mmid 一定在白點的右邊。

反證法:假設 mmid 在白點的左邊,則 mid 也一定在白點的左邊,又由 f(mid) > f(mmid) 可推出 mmid < mid,與已知矛盾,故假設不成立。

所以,此時可以將 r = mmid 來縮小範圍。

2、當 f(mid) < f(mmid) 的時候,我們可以斷定 mid 一定在白點的左邊。

反證法:假設 mid 在白點的右邊,則 mmid 也一定在白點的右邊,又由 f(mid) < f(mmid) 可推出 mid > mmid,與已知矛盾,故假設不成立。

同理,此時可以將 l = mid 來縮小範圍。

這是先增再減的模型 凸型

兩種寫法

int

sanfen

(int l,

int r)

//找凸點

return

f(l)

>

f(r)

? l : r;

}

double

three_devide

(double low,

double up)

return

(m1+m2)/2

;}

後面是先減再增 下凹

和上面反著來

int

sanfen

(int l,

int r)

//找凹點

return

f(l)

>

f(r)

? l : r;

}

double

three_devide

(double low,

double up)

return

(m1+m2)/2

;}

原文**:

例題:c1889 [2019nwu校賽]北境之都

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

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

三分法小結

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

模板 三分法

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