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的有序数列,二分查找成功平均查找次数为:
当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