参考资料:
算法竞赛进阶指南
前言:(摘自算法竞赛进阶指南)
二分法是一种随处可见,却非常精妙的算法,经常能为我们打开解决问题的突破口。二分的基础的用法是在单调序列或单调函数中进行查找。因此当问题的答案具有单调性时,就可以通过二分把求解转化为判定(根据复杂度理论,判定的难度小于求解),这使得二分的运用范围变得更广泛,进一步地,我们还可以扩展到通过三分法去解决单峰函数的极值以及相关问题。
据说只有10%的程序员能写对二分。二分的实现方法多种多样,但是其细节之处确实需要仔细考虑。对于整数域上的二分,需要注意终止边界,左右区间取舍时的开闭情况,避免漏掉答案或者造成死循环,对于实数域上的二分,需要注意精度问题。一般来说,熟练的掌握自己的一种正确写法即可。
二分基础:
二分查找有序数组内的元素:
二分最最基本的作用就是在一个有序的数组中,找到你所需要的关键字。下面就用几张表来展示一下这个过程。
比如给你一个数组(元素为:1 3 4 7 15 23 31 102 102),让你去找到第一个102对应的下标值
我们用L,R来记录还有可能出现待查找关键字的区间[L,R],用mid记录区间的中点,用ans来记录已经找到的答案(如果还没找到就是-1)。则查找过程如下:
初始的情况下,102可能出现的区间为[0,8]
通过比较mid和102,102可能出现的区间为[5,8]
通过比较mid和102,102可能出现的区间为[7,8]