python二分查找实现以及查找次数分析

def binary_search(num_list, x):
    num_list=sorted(num_list)
    left, right = 0, len(num_list)-1
    while left<=right:
        mid = (left+right)/2
        if num_list[mid]>x:
            right=mid-1
        elif num_list[mid]<x:
            left=mid+1
        else:
            return '元素下标为:'+str(mid)
    return '不存在'

二分查找时间复杂度为:O(logN)

二分查找判定树的每个节点的查找次数=该节点所在树的层数

查找成功时的次数不会超过树的深度,假设节点个数为n,那么树的深度为[log2n]+1,其中[log2n]为向下取整

判定树构造

以11个树的列表为例:a=[1,2,3,4,5,6,7,8,9,10,11]

那么判定树如下图所示:

注意一点,在判定树的每棵子树根节点的选取应遵循向下取整原则,或者向上取整,但是必须统一起来。这里是向下取整。

由上图可以推导出平均成功查找长度(ASL)为:(4*4+4*3+2*2+1)/11=3

推而广之:对于节点个数为n的有序数列,二分查找成功平均查找次数为:ASL=((n+1)log2(n+1)-n)/n

当n很大,ASL=log2(n+1)-1

而对于不成功平均查找次数,其实和成功查找次数基本相当(引入外部节点:查找不成功相当于在叶子节点加外部节点)

同样的,再说一下顺序查找的平均查找长度:

对于成功情况:ASL=(n+1)/2

对于不成功情况:无论查找的key是多少,其最终比较次数均为n+1

假设成功与不成功的概率均为1/2,那么两者取均值的结果为:(n+1)/4+(n+1)/2=3(n+1)/4

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值