二分查找
二分查找是经常遇到的一种查找问题,也是最简单的算法基础,自己也在梳理学习基础算法,因此在这里总结一下。以【1,2,......,100】这个有序数组为例说明。
问题:要在这个列表中找到一个给定的数,比如50,如果找到返回ture,否则返回false
在我们学习二分查找之前,肯定有最笨的查找办法,那么很简单我挨个从1~100往上找,直到找到50返回true为止。很显然这样对我们写程序来说太笨了,要是好几万几亿的数字,计算机也累!这时候二分法就很厉害了。
二分法也就是我们平常说的折半法,因为是有序数组(二分只适合有序数组),我可以先比较50和这个数组中间数的大小,不管是大了还是小了,那么另一半的数据可以直接扔掉,不去管它,直接在剩下的这些数里面再次二分,不是很简单了吗。
代码(python):
def binary_search(list, item):
# 定义一个有序列表的两端索引号
low = 0
high = len(list) - 1
# 循环结束条件:最左端不能超过最右端
while low <= high:
mid = (low + high) // 2
midnum = list[mid]
if midnum == item:#找到元素,返回索引号
return mid
if midnum > item:
high = mid - 1
else:
low = mid + 1
return None
number_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(binary_search(number_list, 5))
print(binary_search(number_list, 17))
对于简单查找来说,如果有n个数,那么最坏的情况下需要找n次才能找到这个数,然而对二分法,每次二分完元素个数减半,最坏情况需要 log2(n)次
时间复杂度对比:
简单查找:O(n)
二分法:O(log2(n))