二分查找(折半查找)

1.生活中的二分问题

        猜字游戏:主持人随机写下一个0到99之间的数字,玩家来猜,每猜一次,主持人会告诉玩家他猜的数比写下的数大还是小,直到猜对。

2.时间复杂度分析

        有序数组大小为n,每次查找后数据范围缩小为原来一半。最坏的情况下,区间缩小为1才结束;

        区间变化为n,n/2,n/4,……,n/2^k,当n/2^k = 1时,k就是查找次数;

        每次查找只涉及大小比较操作,k次查找,时间复杂度为O(k);

        n/2^k = 1时,k = log_{2}n,所以二分查找的时间复杂度为O(\log_{}n)

3.二分查找代码

3.1 非递归实现

def binary_search(nums, target):
    i = 0
    j = len(nums) - 1
    m = -1
    # 退出条件: <= 不是 <
    while i <= j:
        # m = (i + j) // 2
        # 向下取整,i、j过大,i+j可能超过整形数据类型可以表示的范围
        # m = i + (j-i)//2
        # 除法改成位运算效率更高,右移1位相当于除以2
        # 原数        0000 1000 ----8
        # 右移一位      0000 0100 ----4 相当于除以2
        # 再右移一位    0000 0010 ----2
        m = int(i + ((j-i)>>1))
        if target == nums[m]:
            return m
        elif target > nums[m]:
            i = m + 1
        else:
            j = m - 1

3.2 递归实现

def binary_search_recursive(nums, target, start, end):
    # nums:待查找区间
    # target:目标数字
    # start:0
    # end:len(nums)-1
    while start <= end:
        m = int(start + ((end-start)>>1))
        if target == nums[m]:
            return m
        elif target > nums[m]:
            return binary_search_recursive(nums, target, m + 1, end)
        else:
            return binary_search_recursive(nums, target, start, m - 1)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值