二分法
luckydrawbox · · 个人记录
整数集合上的二分
假设函数
- 求一个最小的
x ,使check(x)=1 。
while(l<r)
{
int mid=(l+r)>>1;
if(check(mid))
r=mid;
else
l=mid+1;
}
- 求一个最大的
x ,使check(x-1)=0 。
while(l<r)
{
int mid=(l+r+1)>>1;//必须+1
if(check(mid))
l=mid;
else
r=mid-1;
}
实数域上的二分
假设函数
接下来两个方法都是求上面的
- 以精度
eps 为条件,一般需要保留k 位小数时,取eps=10^{-(k+2)} ;表达式一般为[l+eps<r] 。
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;
}