再说三分搜索之前当然要提提二分算法为什么有局限性了。
二分搜索是最长用的,但是它只适用于 函数在自变量区间是单调的,也就是函数图像无极值。对于类似二次型的函数问题(下面会举个例子)
就需要用三分搜索了。
先讲解一下算法吧( 参考资料)
举个具体的例子,3分 查找一个区间内[a,b]函数f(x)的最小值,假设函数是先减后增的 大致的流程是,开始l=a,h=b; 令 m1=l+(h-l)/3 ,m2=l+2*(h-l)/3 ,即3等分(l,h) (这个可以随意不必要等分) 如果f(m1)<f(m2)的话,证明m2一定在最小值的右边(否则在(m1,m2)区间的单调递减的),这样就可以令h=m2,新的(l,h)同样包含最小值点 同理f(m1)>=f(m2) 证明m1一定在最小值的左边 (否则在(m1,m2)区间的单调递增的),,这样就可以令l=m1, 新的(l,h)同样包含最小值点 得到新的(l,h)之后重复上述步骤,直到l与h相差很小
代码的表示如下:
while(ri-le>eps)
{
double mid=(le+ri)/2;
double miid=(mid+ri)/2;
double an1=find(mid);
double an2=find(miid);
if(an1<an2)
ri=miid;
else
le=mid;
}
其中的find可以看做一个函数(具有最小值的)
总结一下:求最小值,每次选大的作为新边界,求最大值,每次选小的作为新的边界。
(如果自己画一下图很容易明白为什么)
下面说一个实际的例子。
空间内有很多点(坐标已知),求空间内一点使其到空间中其余点距离之和最短。
如果求曼哈顿距离,那门很简单,分别暴力加二分求出x,y的最小值就可以了,但是如果求几何距离就比较麻烦了。其实我也不知道如果不给出那一点的某个坐标改怎么求,
但是如果它给出了其中一个坐标那门这个问题就明显是二次函数的问题了。