二分查找算法
定义:在一个单调有序的集合中查找元素,每次将集合分为左右两部分,判断解在哪个部分中并调整集合上下界,重复直到找到目标元素。
时间复杂度:O(logn),优于直接顺序查找O(n)
二分法在ACM中更多查找一个最优解,而非仅仅查找一个数
常见扩展:
对于某些问题,如果答案具有特定范围,并且验证答案是否成立的函数具有单调性。则可以在范围内对答案进行二分验证,从而快速确定答案。
重要模型
1.这个算法除了有序序列查找值外,在求最优解的问题上也很有用。
2.若有一个“求满足某个条件C(x)的最小x” 的问题,如果所有的x’ >=x也满足C(x’)的话,就可以用二分查找来解决。首先我们将区间的左端点初始化为不满足C(x)的值,右端点初始化为满足C(x)的值。然后每次取中点mid=(low+high)/2,判断C(mid)是否满足并缩小范围,直到
(low,high],足够小了为止。最后high就是要求的最小值。
3.最大化问题也可以用同样的方法求解,请自行思考。
4.这样便把最优化问题转化为可行性问题。这种算法也叫作“二分答案”。
5.满足这样性质的问题典型的有“最大值最小化”、“最小值最大化”
注意
1.在输出小数的问题中,一般会指定允许误差范围,在二分时设置合理的精度。
2.循环终止条件可设为像(ub-lb)>EPS这样,如果EPS太小,就可能会因为浮点小数精度的原因导致死循环