三分搜索总结

一、概念:

        一看三分便知道和是由二分演变而来,二分一般求单调区间的情况,而三分适合求凹凸函数,通常用来确定最值,三分是在二分基础上将右区间再分为两个区间。

  

 

二、算法步骤:

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

 

 

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值