ACM 选手带你玩转二分查找!

ACM 选手带你玩转二分查找!

大家好呀,我是 Rocky0429。

今天来讲二分查找呀,可能臭宝们觉得二分查找光看一下“二分”俩字就已经学会了了原理。

确实,二分查找的原理非常简单,但是往往越简单的东西越不容易掌握, 不要把简单和容易画上等号

尤其二分查找在解决实际问题时,要慎之又慎,在细节上稍不注意,臭宝们就可以给自己颁一个“ bug 制造机”的头衔。

至于是不是真的有这么邪乎,接着往下看就知道了。

认识二分查找

二分查找,又叫 折半查找 ,洋名儿 Binary Search

二分查找的使用,要有一个 前提条件 要查找的数必须在一个有序数组里 。在这个前提下,取中间位置数作为比较对象:

  • 若要查找的值和中间数相等,则查找成功。
  • 若小于中间数,则在中间位置的左半区继续查找。
  • 若大于中间数,则在中间位置的右半区继续查找。

不断重复上述过程,直到查找成功或者查找区域变为 0,查找失败。

二分查找在我们的生活中随处可见,比如写好一个 100 以内的正整数,臭宝们来猜我写的是哪一个,我只回答是大了还是小了。

傻瓜做法是一个个的猜,这就不说了。二分查找的话会像下面一样(部分):

由于是 100 以内的正整数,按照二分查找规则,第 1 次先猜 50,如果我说大了,那第 2 次就猜 25,如果我说小了,那第 2 次就猜 75,以此往复。

假设要猜的数是 1,那么过程如下:

数字 第 1 次 第 2 次 第 3 次 第 4 次 第 5 次 第 6 次 第 7 次
1 50 25 12 6 3 2 1

你看只花了 7 次就能找到,是不是很快,而且这还是在最坏情况下,也就是 100 个数的二分查找最多 7 次就能知道结果。

根据二分查找的思想,1000 个数的二分查找最多只需要查找 10 次,10000 以内的数最多只需要查找 14 次,有谁不相信可以自己动手试试,如果你不怕累的话。


下面我带臭宝手把手的复现一个二分查找。

从数组 10、11,21,32,53,85,138,223,361 中,查找是否存在值 21。

利用二分思想,设定 low 和 high 表示需要查找的区间的左右下标,mid 表示需要查找区间的中间元素下标。

过程如下图所示:

通过上面的讲解和例子相信你对二分查找的认识已经足够了,下面就是来看如何实现二分查找。

二分查找常规实现

根据二分查找的思想,我们来看一下二分查找的常规实现。

def BinarySearch(arr, low, high, target):
    low, high = 0, len(arr) - 1
    while low <= high:
        mid = (low + high) / 2
        if arr[mid] == target:
            # 找到 target
            return mid