《算法图解》——学习笔记之一:二分查找法

     题记——在最近的研究中深感算法和数据结构知识的不足,温故而知新,特此开贴,算是复习以前的知识。本文是对《算法图解》一书的学习笔记,作为自己的知识积累,欢迎各位读者共同学习。转载请注明文章出处。

分割线~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

     算法是一组完成任务的指令,本文研究的二分查找,是这样一种查询算法:

     二分查找的输入是一个有序的元素列表(注意要有序),如果要查找的元素包含在列表中,二分查找返回其位置,否则返回null。

      这个意思很简单,想想小时候做过的猜数字游戏,给十个数,0到9,抽一个数字让小朋友猜,如果比中间数小,则数字肯定在0到9的前一半,反之则在后一半,然后不停的猜下去,肯定能找到答案。这就是二分查找法。与之对比的,是简单查找法,就是从0开始猜对不对,匹配上了就是对的。这种方法最坏的情况是要猜10次。所以,书中形象的称其为傻找法

     使用二分查找的优点是,每次都可以将余下的数字排除一半,这样大大提高了查询效率,用大O表示法,其算法复杂度为logn(底数是2),简单查找是n。

     所以,代码实现就是这样的:

#二分法查找算法
def binary_search(list, item):
    low = 0               #起始位置为0
    high = len(list) - 1  #最大序列号为列表长度减一

    while low <= high:    #保证列表不为空,至少有一个元素
        mid = int((low + high) / 2) #中间元素的索引号取整数
        guess = list[mid]  #检查中间的元素,每次都猜中间的元素值
        if guess == item:  #猜测的数字就是答案
            return mid    #返回并输出中间元素的索引号
        elif guess > item: #如果猜测的数字大于答案
            high = mid - 1    #那么列表最大值索引号变成中间值索引号减一
        else:
            low = mid + 1   #当猜测的数字小于答案,最小值的索引号变成中间值索引号加一
    return None

if __name__ == '__main__':
    my_list = [1,3,5,7,9]

    print(binary_search(my_list,7))
    print(binary_search(my_list,-1))

结果是:

3
None

总结:二分查找算是非常简单的算法了,简洁明了。《算法图解》中关于这一段代码的编写有些错误,本文已经改正,并且使用python3进行编写,方便初学者对照原书进行学习。如果有更好的优化想法,欢迎交流。

备注:更新代码和注释,使其更加符合惯性思维

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值