为什么二分查找的中间轴点常写为left + (right - left) // 2?
二分查找轴点计算逻辑说明
首先附上对应的Python二分查找实现代码:
left, right = 0, len(nums) - 1 while left <= right: # // 2 -> 向下取整 pivot = left + (right - left) // 2 if nums[pivot] == target: return pivot if target < nums[pivot]: right = pivot - 1 else: left = pivot + 1
采用left + (right - left) // 2而非len(nums) // 2的核心原因
- 适配动态缩小的查找区间
len(nums) // 2计算的是整个数组的固定中点,仅在第一次查找时有效。二分查找的核心逻辑是每次比对后都会缩小查找范围,左边界left和右边界right会随查找过程动态调整,后续的查找区间已经不是完整的原数组,用原数组长度计算的中点根本不在当前有效查找区间内,无法完成后续查找逻辑。 - 避免整数溢出(跨语言通用兼容)
这种写法是各类语言实现二分查找的通用规范:在C、C++、Java等存在固定长度整数类型的语言中,如果left和right的取值都接近整型最大值,直接计算left + right会发生整数溢出,得到负数结果,最终计算出的pivot完全错误。而left + (right - left) // 2的计算过程中,right - left始终是非负数,和left相加后的结果不会超过right的取值,从根源上避免了溢出问题。虽然Python的int支持任意精度不会触发溢出,但保留这种写法可以保证代码的跨语言可读性和逻辑通用性。
内容的提问来源于stack exchange,提问作者2ntro
相关产品推荐
相关产品推荐

