二分查找法最大最小比较次数

Content

  • 实现过程
  • 关键思路
  • 最大最小比较次数
  • Python实现
  • ?线性查找法

1. 实现过程

Example:

在顺序表 [10,20,30,40,50,60,70] 中,用二分法查找关键码60。

数值1020304050607080
下标01234567

以上8个数,从0到7编码,查找过程如下:

  • 第一轮
    mid =(left + right)/ 2 = (0 + 7) / 2 = 3 ,「向下取整」
    -> 目标值60与下标为3的值40进行比较,40<60,则 left = mid + 1 = 4;

  • 第二轮
    mid = (left + right)/ 2 = (4+7) /2 = 5,「向下取整」
    -> 目标值60与下标为5的60比较,60=60,返回下标5,算法结束。

共比较了2次。


2. 关键思路

  • 使用二分查找前,必须先保证数组有序;
  • 每次二分按照 mid=(left + right)/ 2向下取整;
  • 目标值与下标为mid的值比较,若目标值较大(小),则left = mid + 1right = mid - 1);
  • 直至成功找到目标值,停止。

3. 最大最小比较次数

  • 最小比较次数为1,例如[1,2,3]二分查找2。

  • 最大比较次数为log2(n) + 1 向下取整,

对有序表,根据二分查找法定义,每次比较之后问题规模都会减小一半,所以2^k=N,解得k=log2(n)。又因为最后只剩一个元素时,也要执行查找过程,所以+1。


4. Python实现

def BinarySearch(arr, key):
    left = 0
    right = len(arr)-1
    
    while left <= right:
        mid = (left + right)//2
        if key == arr[mid]:
            return mid
        elif (key < arr[mid]):
            right = mid - 1
        else:
            left = mid + 1
  • 输出:

在这里插入图片描述


5. vs 线性查找

在无序的数组中查找一指定值,必须遍历整个数组,直至查找成功。

  • 最小查找次数为1,即第一个值即为目标值;
  • 最大查找次数为n,即最后一个值才是目标值;
  • 平均查找次数为(n+1)/2,即(1+2+3+……+n)/n 。

6. 参考

  • https://blog.csdn.net/u010992313/article/details/89373480
  • https://blog.csdn.net/iteye_3748/article/details/82677136
  • https://blog.csdn.net/picc_lu/article/details/97247031
  • https://www.baidu.com/link?url=dG930Wgj8gRWERgRMXzzoKxPItF2QochfTZlqSR2kqZFdbUavWeSwOqNw8ckQfQB&wd=&eqid=ba0f797b000cb42a000000065d774886
  • 6
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值