如果让你在一堆数中,查看某个数是否存在?你会怎么找?
按常识是不是一个一个看过去?这个我们就叫顺序查找
最好的情况就是看到第一个就是你要的,就不会往下看了,但是如果是最后一个数是你想要的,这种情况下,查看次数就变成了数字的个数
如果数很多时,比如亿计,会不会觉得效率很低
def linear_search(li, val): for ind, v in enumerate(li): if v == val: return ind else: return None
下面我们介绍的二分法查找,要比顺序查找有效的多,但是前提示是这堆数字要有序
实现思路大体如下:
- 取最中间数,拿它和查找值比较
- 如果中间数大(假设数是从小到大排),那说要找的数在左边,排除右边
- 取左边一半里的中间数,和查找值比较,这样又可以排除一半,这循环下去,直到找到或得到没有这个数
编写二分法查找的代码时,注意左右边界的变化,以及取中间值比较,一直循环的条件就是左右边界不碰头left<=right
def binary_search(li, val): left = 0 right = len(li) - 1 while left <= right: # 候选区有值 mid = (left + right) // 2 if li[mid] == val: return mid elif li[mid] > val: # 带查找的值在mid左侧 right = mid - 1 else: # li[mid] < val 带查找的值在mid右侧 left = mid + 1 else: return None
总结:二分法查找前提是有序的,当然排序也又是要多花时间的,用不用二分法查找看场景,如果你只是查一次,那二分法查找,反而更慢,因为排序,如果你查好多次,那就可以排好一次好,复用二分法查找