关于三分的一些理解
一些需要知道的东西:
定义: 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
三分+物理:求最大影长
我写的题解 这里写链接内容