在说三分法之前,先说一下二分法与三分法的区别。
二分法:只适用于单调函数,常用于对单调递增或单调递减的一个序列的某一个元素进行查找。
三分法:三分法用于单峰函数,左边递增右边递减或者左边递减右边递增的函数,也就是凸函数和凹函数。以凸函数为例(凹函数类似,只是判mid大小的时候保留小的即可(其实也是保留离极值最近的mid)),先以left和right为端点计算出它们的中点midl,然后再以midl和right为端点计算出它们的中点midr,接下来就需要判断f(midl)和f(midr)值的大小了,如果f(midl)大于f(midr),那么说明midl靠近极值,此时令right=midr,否则说明midr靠近极值,此时则令left=midl,总之就是要保留离极值最近的那一个mid,然后重复前面的过程,直到left和right十分接近,最终f(left)就等于了极值,下面给出
double f(double x){
//something
}
const double eps=1e-8;
double sanfen(double l, double r){
double mid,midr,ans;
while (fabs(r-l)>eps) {
mid=(l+r)/2;
midr=(mid+r)/2;
if(f(mid) < f(midr)) l=mid;
else r=midr; //求最大值
}
ans=f(l);
return ans;
}