二分查找边界left、right小结

二分查找的边界分析

数组:L,长度:len(L),查找目标:target,左left,右right,中间mid,找到返回索引,没找到返回-1
L:递增数组
left = 0
right = len(L) 或者 len(L)-1
循环条件:left < right 或者 left <= right
mid = (left + right)//2
L[mid]<target L [ m i d ] < t a r g e t ,left = mid 或者 mid + 1
L[mid]>target L [ m i d ] > t a r g e t ,right = mid 或者 mid - 1

常见的2种二分查找

# len(L) = 3
L1 = [2,4,6]
# len(L) = 4
L2 = [2,4,6,8]
# target
targets = [1,2,3,4,5,6,7,8,9] 
  • 循环条件 left<right l e f t < r i g h t
def binary_search(L, target):
    left, right = 0, len(L)
    while left < right:
        mid = (left + right)//2  #下取整
        if L[mid] < target:
            left = mid + 1
        elif L[mid] > target:
            right = mid
        else:
            return mid
    return -1
[binary_search(L1, target) for target in targets]
[-1, 0, -1, 1, -1, 2, -1, -1, -1]
[binary_search(L2, target) for target in targets]
[-1, 0, -1, 1, -1, 2, -1, 3, -1]
  • 循环条件 left<=right l e f t <= r i g h t
def b_search(L, target):
    left, right = 0, len(L)-1
    while left <= right:
        mid = (left + right)//2
        if L[mid] < target:
            left = mid + 1
        elif L[mid] > target:
            right = mid - 1
        else:
            return mid
    return -1        
[b_search(L1, target) for target in targets]
[-1, 0, -1, 1, -1, 2, -1, -1, -1]
[b_search(L2, target) for target in targets]
[-1, 0, -1, 1, -1, 2, -1, 3, -1]

二分查找边界分析

# len(L) = 3
L1 = [2,4,6]
# len(L) = 4
L2 = [2,4,6,8]
# target
targets = [1,2,3,4,5,6,7,8,9] 
  • 正常查找结果
"""
[    2,     4,     6            ]
[1,  2,  3, 4,  5, 6,  7,  8,  9]
[-1, 0, -1, 1, -1, 2, -1, -1, -1]
------------------------------
[    2,     4,     6,     8    ]
[1,  2,  3, 4,  5, 6,  7, 8,  9]
[-1, 0, -1, 1, -1, 2, -1, 3, -1]

"""
  • right = len(L)
def binary_search_test(L, target):            1. 修改right = len(L)-1
    left, right = 0, len(L)                   结果:L[-1],也就是末尾一个找不到
    while left < right:                       2. 修改left = mid
        mid = (left + right)//2  #下取整       结果:死循环
        if L[mid] < target:                   3. 修改left = mid, right = mid -1 
            left = mid + 1                    结果:死循环
        elif L[mid] > target:                 4. 修改right= mid -1
            right = mid                       结果:L1,2 没找到;L2,46没找到
        else:                                 5. 修改left<=right
            return mid                        结果:死循环
    return -1
print(L1)
print(targets)
print([binary_search_test(L1, target) for target in targets])
print('------------------------------')
print(L2)
print(targets)
print([binary_search_test(L2, target) for target in targets])
[2, 4, 6]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[-1, 0, -1, 1, -1, 2, -1, -1, -1]
------------------------------
[2, 4, 6, 8]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[-1, 0, -1, 1, -1, 2, -1, 3, -1]
  • right=len(L)-1
def b_search_test(L, target):                 1. 修改right = len(L) 
    left, right = 0, len(L)-1                 结果:IndexError: list index out of range
    while left <= right:                      2. 修改left = mid 
        mid = (left + right)//2  #下取整       结果:死循环
        if L[mid] < target:                   3. 修改left = mid, right = mid
            left = mid + 1                    结果:死循环
        elif L[mid] > target:                 4. 修改right= mid
            right = mid - 1                   结果:死循环
        else:                                 5. 修改left<right
            return mid                        结果:L1,26没找到;L2,28没找到
    return -1
print(L1)
print(targets)
print([b_search_test(L1, target) for target in targets])
print('------------------------------')
print(L2)
print(targets)
print([b_search_test(L2, target) for target in targets])
[2, 4, 6]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[-1, 0, -1, 1, -1, 2, -1, -1, -1]
------------------------------
[2, 4, 6, 8]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[-1, 0, -1, 1, -1, 2, -1, 3, -1]
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值