简介
算法是一组完成任务的指令。任何代码片段都可视为算法。但是不同的代码逻辑实现了同一功能,但性能可能有几万倍的差别。举个简单的例子:现在我们来玩一个猜字的游戏,A说:我心里从0-100默记一个数,由你来猜,如果你猜的数字比我大,我会提示你太大了,反之亦然。那么问题是你如何能快速的猜到A心里想的数字呢?看完这篇文章你就会得到答案。
二分法查询
对于上面的问题,我们可能有多种方法来解决,例如:
- 我可以 0,1,2,3 ... ... 这样依次猜下去,虽然方法苯一些,但最多我猜100次,肯定可以猜到。
- 我可以随机的猜测,只要不和之前的数字重复即可,其实这和第一种方法一样,最差的情况是100次。
- 我可以采用二分法查找,我每次都折半,这样第一次我就可以排除掉50个数字,第二次又排除25个数字,依次类推,我最多7次就可以猜到你心里想的数字。
可能有人会有疑问,你二分法需要查7次,我随机猜测有可能1次就能猜中,所以并不一定你的方法就是好的。确实是这样,但是要知道你一次性猜对的概率只有1%。而二分法7次猜到准确数字的概率为100%。再者,如果数字更大呢,例如是10个亿呢,我估计你猜你年都未必猜中吧,二分法猜中的次数只需要30次。是否感受到了二分法的魅力,赶紧跟我来一起实现以下吧。
直接上代码
# 二分法查询,输入一个列表和猜测的数字,使用最短的时间找出这个数字
def binary_search(numlist,item):
low = 0 #列表的最小索引值
high = len(numlist)-1 #列表的最大索引值
while low <= high: #只要最新索引值不大于最大索引值,就认为没有猜对
mid = (low + high)//2 #获取列表的中间索引值
guess = numlist[mid] #默认猜测数字是中间数字
if guess == item:
return mid
if guess > item: #每次都通过中间数字去和猜测的数字对比,每次清除一半的队列
high = mid -1
else:
low = mid + 1
return None
my_list = [x for x in range(10000)]
print(binary_search(my_list,385))