二分查找适用于单调函数,那么三分查找适用于凸函数或者凹函数。也就是说二分是查找区间,相当于一次函数,三分就是二次函数了,求它的极值,怎么做,数学常用的是求导,计算机就用查找。如下图所示:
求解的过程是这样的:
while(l<r-1)
{
int mid=(l+r)/2;
int midmid=(mid+r)/2;
if(f(mid)>f(midmid)//是求最大值还是最小值
r=midmid;
else
l=mid;
}
return f(l)>f(r)? l:r
另外一种写法
while(r-l>=eps)
{
m1=l+(r-l)/3;
m2=r-(r-l)/3;
if(f(m1)<f(m2))
l=m1;
else
r=m2;
}
return (m1+m2)/2;