三分查找

关于三分的一些理解

一些需要知道的东西:

定义: y = f(x) ; x 的取值 可以是离散的也可以是连续的 。y与x 在直角坐标系上的图像是单峰的,即只有一个最大值或最小值。

三分查找的目的是: 给定区间 [L R] 求区间最值(凸的最大值 凹的最小值)

在三分查找中用到的辅助变量有:l :三分查找的一个下界 ; r :三分查找的一个上界 ; mid : 上界和下界的中点 即 (l+r)/2 ; mmid 中点和上界的中点 即 (mid+r)/2 具体情况如下图所示:
这里写图片描述

三分查找的说明(以凸峰为例,凹峰类似):
1. 三分查找 和 二分查找 类似,通过高效缩小上下界来 锁定 目标值

2.易见整个区间被划分为 三段 [l mid] , [mid mmid] 和 [mmid r] 每次缩小区间我们需要做的是舍弃其中的某些

3.如果最值存在 ,会在三段区间其中之一,但是,判断在哪一个里面,是困难的。但所幸,判断不在那一段里面却是极简单的;

i) 当 f(mid) > f(mmid) 的时候,我们可以断定 最值一定不在 [mmid r]中 。我们可已把它舍去缩小区间  即 r=mmid

    证明:f(mid) > f(mmid) 说明在 [mid mmid] 中 必然经历过一个减少的过程  才能使得f(mmid) 小于f(mid) ,即 存在一个点 k ,使得 f(x) 在 [k mmid]  是单调递减的。从凸单峰函数的性质来看,如果某一段区间是单调递减的,那么之后的所有区间都是单调递减的。因而 [mmid  r] 不存在最值

ii) 当 f(mid) < f(mmid) 的时候,我们可以断定 最值一定不在 [l mid]中 。我们可已把它舍去缩小区间  即 l=mid

    证明与上面类似

4.如果 r - l=1(或者是 esp) 是,比较一下 l,r,即可得到答案。

综上所述我们可以建立一个 循环不变体:

初始化: l=L,r=R ,mid=(L+R)/2, mmid=(mid+r)/2 最值需要在[L R]中 并且 f(x) 是单封凸函数

循环体: 按上述 1,2,3,算出每一次的 l,r,mid,mmid 值

终止: r-l=1(或者是 esp)

最后
比较得出答案

模板

//这里是三分的内容 
double oneThird(double l,double r){
    while(r-l>esp){
        double mid=l+(r-l)/2;
        double mmid=mid+(r-mid)/2;
        if(f(mid)>f(mmid)){
            r=mmid;
        }
        else l=mid;
    }
    return l;
}

这些题大家可以练习(遇到补充)

1.Light Bulb ZOJ - 3203
三分+物理:求最大影长
我写的题解 这里写链接内容

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值