Python 二分查找

本文章的所有代码和相关文章, 仅用于经验技术交流分享,禁止将相关技术应用到不正当途径,滥用技术产生的风险与本人无关。
本文章是自己学习的一些记录。

开始

二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

示意图

二分查找只能作用到顺序表当中,而且是作用于有序的顺序表当中
在这里插入图片描述
按照这样的思路查找元素4是否存在:
在这里插入图片描述
根据下标值(红色数字):
1、首先查找出7为中间值,即(0+8)//2;
2、因为要查找的4小于7,所以在7的左侧查找;
3、在1-6之间查找出中间值为3,即(0+3)//2;
4、因为要查找的4大于3,所以在3的右侧查找;
5、在4-6之间找出中间值为2,即(2+3)//2;
6、所以最终的定位是索引值为2,值为4,存在。
所以这就是二分查找的思路,也可以分为递归的思想和非递归的思想

代码

#coding=utf-8
#@Time:2020/10/4 13:24
#@Author:csdn@hijacklei
#@File:二分查找.py
#@Software:PyCharm
'''二分查找作用于顺序表,而且是有序的顺序表'''
# 1、递归思想的二分查找
def binary_search(alist,item):
    n=len(alist)

    if n>0:
        mid = n // 2 #找到中间值
        if alist[mid]==item:
            return True  #证明中间值就是要找的值
        elif alist[mid]<item:
            return binary_search(alist[mid+1:],item)  #在中间值的右侧是目标值,按照递归的思想进行调用函数
        else:
            return binary_search(alist[:mid],item)    #在中间值的左侧是目标值,按照递归的思想进行调用函数
    return False
'''递归思想是划分后的区域新建立的列表进行调用函数的递归思想
非递归思想是在原有的划分的区域继续进行划分'''
# 2、非递归思想的二分查找
def binary_search_1(alist,item):
    '''非递归思想的二分查找'''
    n=len(alist)
    # 定义初始位置的索引
    first=0
    last=n-1
    while first<=last:
        mid=(first+last)//2
        if alist[mid]==item:
            return True
        elif alist[mid]<item:
            first=mid+1
        else:
            last=mid-1
    return False


if __name__ == '__main__':
    li=[17, 20, 26, 31, 44, 54, 55, 77, 93]
    print(binary_search(li,55))
    print(binary_search(li,100))
    print(binary_search_1(li, 77))
    print(binary_search_1(li, 200))

返回的结果:
在这里插入图片描述

时间复杂度的计算

最优时间复杂度:
在计算最优时间复杂度的时候,也就是一开始就找到了要找到的值:
所以最优的时间复杂度为:O(1)
最坏时间复杂度:
因为要查找出想要的元素,也就是不断的二分,在某一个区域进行查找:
所以最坏时间复杂度为:O(logn)

参考资料:传智播客数据结构

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值