二分是我们再熟悉不过的字眼了.计算机科学由于其特殊性更是与“2”结下了不解之缘.
尽管二分思想本身很简单,但它的扩展性之强、应用面之广,仍然很有研究的价值。我们从最简单的二分查找开始逐步探究二分思想在信息学竞赛中的应用.
二分查找,也叫折半查找,是一种适用于顺序存储结构的查找方法。它是一种效率较高的查找方法,时间复杂度为 O(lgn),但它仅能用于有序表中。也就是说,表中的元素需按关键字大小有序排列。
二分查找用左右两个指针来标注查找范围。程序开始时,查找范围是整个线性表,左指针指向第一个元素,右指针指向最后一个元素;每一次循环过后,查找范围都缩小为原先的一半,直到左右指针重叠或者左指针处于右指针的右侧。因为每次缩小一半的范围,所以可以得出二分查找的时间复杂度为 O(lgn)。
我们以图 1 中的有序数组为例进行二分查找。格子中的数是数组的每个位置上存储的数据,格子下方的数是下标。
首先看一下二分查找与顺序查找的对比,可以看出 binary search 在查找数字 37 时只需3次,而 sequential search 查找37时需要11次。