给我5分钟,讲明白二分查找法——
一、算法原理:
二分查找,也叫折半查找,是一种适用于顺序存储结构的查找方法。它是一种效率较高的查找方法,时间复杂度为O(lgn),但它需要注意:它仅能用于有序表中。也就是说,表中的元素需按关键字大小有序排列。
假设有如下一本页的书,给定一个页码,如何快速地找到它呢?如果一页一页逐步查找,最高是不是可能要次?但用二分法,就可以把查找的次数降到个位数。
第一步:找到1~的中位数,通过索引去找,索引是从0开始的,所以这里就是(0+)//2=,对应数值为。即:
第二步:给定一个想要查找的页码比如,将与中位数进行比较,因,则锁定左区:
第三步:求左区的中位数,方法与第一步相同,求得索引为,对应数值为。即:
第四步:将与比较,因,则锁定右区:
依次类推,最终找到页码,找到的意思就是找到页码对应的索引,这个例子里数列是1~,每次增加1,可能有些同学会感觉这还需要找吗,都可以直接看出来了。
但想象一下,实际碰到的数列不一定是等比或等差,这时候就得有一种算法快速地能定位想找的这个数的位置(即索引),通过直观去看是看不出来的。
二、Python代码实现
看懂了算法的原理介绍,代码就是算法的具现:
这段算法每个语句都加上了注释,应该很容易读懂。这里查找到第9次,就找到了对应的索引。具体运行结果为:
此外,我们可以察觉到算法的原理实际上是一个递归的过程,因为代码也可以用递归来实现:
运行结果相同,具体为: