三分搜尋總結
阿新 • • 發佈:2019-01-25
一、概念:
一看三分便知道和是由二分演變而來,二分一般求單調區間的情況,而三分適合求凹凸函式,通常用來確定最值,三分是在二分基礎上將右區間再分為兩個區間。
二、演算法步驟:
(1)先取整個區間的中間值 mid = (x+y)/ 2 ;
(2)再將右區間分為兩個區間 midd = ( mid + y ) /2 ;
(3)然後比較 mid 與 midd 所形成的值那個最接近最值,如果 mid 接近則讓 y = midd ,否則讓 x = mid .
if (cal(mid) > cal(midmid)) right = midmid; else left = mid;
(4)重複(1)(2)(3)一直找到最值。
演算法的正確性:
1、mid與midmid在最值的同一側。由於凸性函式在最大值(最小值)任意一側都具有單調性,因此,mid與midmid中,更大(小)的那個 數自然更為靠近最值。此時,我們遠離最值的那個區間不可能包含最值,因此可以捨棄。 2、mid與midmid在最值的兩側。由於最值在中間的一個區間,因此我們捨棄一個區間後,並不會影響到最值 三、模版const double EPS = 1e-10; double calc(double x) { // f(x) = -(x-3)^2 + 2; return -(x-3.0)*(x-3.0) + 2; } double ternarySearch(double low, double high) { double mid, midmid; while (low + EPS < high) { mid = (low + high) / 2; midmid = (mid + high) / 2; double mid_value = calc(mid); double midmid_value = calc(midmid); if (mid_value > midmid_value) high = midmid; else low = mid; } return low; }