三分查找

一、概念

   在二分查找的基础上,在左(右)区间上在进行一次二分,这样的查找算法称为三分查找。

   用途:通常用来确定最值。

   适用条件:搜索序列为凸序列,即该序列存在最大(小)值,在最大值(最小值)的左侧序列,必须满足不严格单调递增(递减),右侧序列必须满足不严格单调递减(递增)。

    如下图,表示一个有最大值的凸性函数:

                                                1

算法描述:

(1) 先取整个区间的中间值

MidL = ( Left + Right ) / 2;
(2) 再选取右(或左)区间的中间值

MidR = ( MidL + Right ) / 2;
(3) 通过比较Mid1与Mid2中谁最靠近最大(小)值,保留最靠近最大(小)值的Mid,然后缩小区间。

    如上图,mid比midmid更靠近最大值,保留mid,舍弃midmid的右区间。

if ( cal(MidL) > cal(MidR) )
    Right = MidR;
else
    Left = MidL;
(4)重复步骤(1)(2)(3),直至找到最大(小)值。

实现代码:

const double EPS = 1e-10;   // 精度
double Calc( double x );    // 函数

double TernarySearch( double Low, double High )
{
	double MidL, MidR;

    while( Low + EPS < High )
    {
        MidL = ( Low + High ) / 2;
        MidR = ( MidL + High) / 2;

        double MidL_Val = Calc( MidL );
        double MidR_Val = Calc( MidR );
        if ( MidL_Val > MidR_Val )
            High = MidR;
        else
            Low = MidL;
     }

     return Low;
}

算法复杂度:O(log3 |High - Low| )


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值