1. 程式人生 > >三分搜尋總結

三分搜尋總結

一、概念:

        一看三分便知道和是由二分演變而來,二分一般求單調區間的情況,而三分適合求凹凸函式,通常用來確定最值,三分是在二分基礎上將右區間再分為兩個區間。

 

二、演算法步驟:

(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;
}