二分查找的边界分析
数组: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,4,6没找到
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,2、6没找到;L2,2、8没找到
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]