知道二分吧
while(l <= r)
{
int mid = (l + r) >> 1;
ans++;
if(a[mid] < w)
l = mid + 1;
else if(a[mid] > w)
r = mid - 1;
else
break;
}
while(l <= r)
{
int mid = (l + r) >> 1;
ans++;
if(a[mid] < w)
r = mid - 1;
else if(a[mid] > w)
l = mid + 1;
else
break;
}
现在变一下
while(r - l >= eps)
{
double k = (r - l) / 3.0;
double lmid = l + k;
double rmid = r - k;
if(f(lmid) > f(rmid))
r = rmid;
else
l = lmid;
}
这就是三分,即lmid,rmid两个中点,且由于是除以三,所有的数用double类型
那么三分法可以解决什么呢?
对于这样的一个有极值函数求极值,我们每次比较一下f(lmid)与f(rmid)的大小,若前者大,则rmid一定位于极值的右侧,我们令r=rmid ;反之lmid一定位于极值左侧,令l=lmid,当l=r时,l即为极值点,这就是三分法的应用
补充:
秦九韶公式(百度百科)
一般地,一元n次多项式的求值需要经过(n+1)*n/2次乘法和n次加法,而秦九韶算法只需要n次乘法和n次加法。在人工计算时,一次大大简化了运算过程。
把一个n次多项式
改写成如下形式:
就可以简化计算
double f(double x)
{
double ans = 0;
for(int i = 0; i <= n; i++)
ans = ans * x + a[i]; //秦九韶公式
return ans;
}