二分三分法 (二)

最近刚学了二分法,还没有学三分,所以在上课之前,把三分总体的预习了一下,感觉三分应该和二分大体的思路还是一致的,二分的思路是在一个单调的数列基础上,每次都求中间值,然后不断缩小,最后求出解,这样可以把时间压缩到最小化。然而三分主要运用的方面是针对于数列是凹函数或者凸函数,先将一个区间分成3份,每份占1/3,比较mid1和mid2谁更加接近极值,我们假设mid1更加靠近极值,那么右区间就等于mid2,反之左区间等于mid1
代码模板:


#define eps 10e-6
double cal() {} //计算题目所需要的值
while(l+eps<r)
{
    m1=l+(r-l)/3;
    m2=r-(r-l)/3;
    v1=cal(m1);
    v2=cal(m2);
    if(v1<v2)l=m1;
    else r=m2;
}

另外的一种比较好理解的写法:

double Calc(Type a)
{
    /* 根据题目的意思计算 */
}
 
void Solve(void)
{
    double Left, Right;
    double mid, midmid;
    double mid_value, midmid_value;
    Left = MIN; Right = MAX;
    while (Left + EPS < Right)
    {
        mid = (Left + Right) / 2;
        midmid = (mid + Right) / 2;
        mid_area = Calc(mid);
        midmid_area = Calc(midmid);
        if (mid_area >= midmid_area) Right = midmid;
        else Left = mid;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值