二分法
整数集合上的二分
假设函数 满足存在一个整数 ,使得 。
- 求一个最小的 ,使 。
while(l<r)
{
int mid=(l+r)>>1;
if(check(mid))
r=mid;
else
l=mid+1;
}
- 求一个最大的 ,使 。
while(l<r)
{
int mid=(l+r+1)>>1;//必须+1
if(check(mid))
l=mid;
else
r=mid-1;
}
实数域上的二分
假设函数 满足存在一个实数 ,使得 。
接下来两个方法都是求上面的 。
- 以精度 为条件,一般需要保留 位小数时,取 ;表达式一般为 。
while(l+eps<r)
{
double mid=(l+r)/2;
if(check(mid))
r=mid;
else
l=mid;
}
- 精度不适合表示或确定时,采用固定循环次数的二分方法,这种方法得到的结果的精度更高。
for(int i=1;i<=100;i++)
{
double mid=(l+r)/2;
if(check(mid))
r=mid;
else
l=mid;
}

浙公网安备 33010602011771号