《算法图解》日志一(python)(二分查找法)

二分查找

二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列.(摘自算法导论)

更佳的查找方法

现在我们来玩一个猜数的游戏,假设有一个人要我们猜0-99之间的一个数。那么最好的方法就是从0-99的中间数49开始猜。如果要猜的数小于49,就猜24(0-48的中间数);如果要猜的数大于49,就猜74(50-99的中间数)。重复这个过程来缩小猜测的范围,直到猜出正确的数字。二分查找的工作方法就类似于此.

说明

1、我们会经常谈到log(对数)时间,因此你必须明白对数的概念,哔哩哔哩就有个视频是介绍对数的(课程⬅点击,免费)
2、在列表是有序的时候,二分查找才是管用的,例如电话谱就是有序的,那如果是无序的会怎么样呢?

知识站点

本系列使用大0表示法(下一章介绍)讨论运行时间时,log
指的都是log2。使用简单查找法查找元素时,在最糟情况下
需要查看每个元素。因此,如果列表包含8个数字,你最多
需要检查8个数字。而使用二分查找时, 最多需要检查log n
个元素。如果列表包含8个元素,你最多需要检查3个元
素,因为log8=3 (23= 8)。如果列表包含1024个元素,
你最多需要检查10个元素,因为log 1024 = 10 (21
=1024),

对数

对数(logarithm)是对求幂的逆运算,一个数字的对数是必须产生另一个固定数字(基数)的指数。对数的符号log出自拉丁文logarithm,最早由意大利数学家卡瓦列里(Cavalieri)所使用。如果a的x次方等于N(a>0,且a不等于1),那么数x叫做以a为底N的对数,记作x=logaN。其中,a叫做对数的底数,N叫做真数

示例代码

def bin_search(data_list, val):    
    low = 0                         # 最小数下标    
    high = len(data_list) - 1       # 最大数下标    
    while low <= high:        
        mid = (low + high) // 2     # 中间数下标        
        if data_list[mid] == val:   # 如果中间数下标等于val, 返回            
            return mid        
        elif data_list[mid] > val:  # 如果val在中间数左边, 移动high下标            
            high = mid - 1        
        else:                       # 如果val在中间数右边, 移动low下标            
            low = mid + 1    
    return # val不存在, 返回None
ret = bin_search(list(range(1, 10)), 3)
print(ret)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值