二分法查询

简介
算法是一组完成任务的指令。任何代码片段都可视为算法。但是不同的代码逻辑实现了同一功能,但性能可能有几万倍的差别。举个简单的例子:现在我们来玩一个猜字的游戏,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))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值