- 从概率论的角度为什么我们要二分,因为可以更好的均摊风险..
- 好处:lgN复杂度,坏处是data need preprocessing into sorted. 所以加之其作用对象是array, 所以其实适用场景是多次查询,如果涉及插入和删除它不适用.
- 大型数据无足够的内存也不适合二分查询
-
二分查询函数返回的是区间, 要查找的函数所在的可能的区间.
-
中点mid 的选择 :
mid = left + (right - left)//2 ## 这个没什么好说的统一此格式
中点应该在闭区间方向向中心靠近
-
理解 loop invariant:
- 搜索范围
[first, last)
不为空,即first < last
- 搜索范围
[first, last)
左侧,即[first0, first)
内所有元素(若存在),都小于value
其中first0
是first
的初始值 - 搜索范围
[first, last)
右侧,即[last, last0)
内所有元素(若存在),都大于等于value
,其中last0
是last
的初始值.
- 搜索范围
def binarySearch(nums, target):
l, r = 0, len(nums)
while l < n:
mid = l + (n - l ) // 2
if nums[mid] == target:
return mid
elif nums[mid] < target:
l = mid + 1
else:
r = mid ### r 是闭区间
return l
- 查找第一个不小于目标值的数,可变形为查找最后一个小于目标值的数
##
- ****
- ****