二分法端点问题总结


二分法在有序搜索中作为暴力破解的辅助手段非常有用;二分法的端点问题是写每个题都要仔细考虑的!一般来讲,为了循环能有出口,通常循环结束条件是

int l,r,mid;
while(l<r);

在循环体内l,r,mid的更新关系是

mid = (l+r)/2;
if(contion exptr){
    l = mid+1;
}
else {
    r = mid;
}

这种写法的特点是不对某个数特判,适合寻找相对值,mid取整,奇数情况下数据分割自然偏向于左侧。另一种写法是

mid = (l+r)/2;
if(mid meets contion exptr){};
else if(contion exptr){
    l = mid+1;
}
else {
    r = mid-1;
}

这种写法的特点是对mid特判,适合寻找数据。以上两种都会把数据分割成不相交的两个子集,从而最终都会退出循环。
通常mid用来判断搜索的方向,确定要找的数在哪一部分,在范围相对值中,如寻找比x小的最大数,并且因为mid是包含的,所以通常用条件去左侧找即始终使用num[mid]

if(num[mid]<x){
    r = mid;
}

猜你喜欢

转载自blog.csdn.net/xiyuan1223/article/details/79209025