Python二分查找为何使用mid=(high+low)//2而非mid=high//2
二分查找mid计算方式问题解答
二分查找的核心逻辑是每次动态缩小搜索区间,你当前的搜索范围是[low, high]这个闭区间,不是永远从数组首地址开始的,这是两种写法本质区别的来源。
为什么mid = high // 2是错的
- 只有第一次循环时low=0,这时候
(low+high)//2和high//2的结果确实一致,但只要你进入下一轮循环,low就会因为排除左半区间而大于0,此时high//2计算出来的索引根本不在你当前的有效搜索区间内,完全没有参考价值。 - 拿你给出的测试代码举例,假设我们要找的值是40:
- 第一次循环:low=0,high=4,两种写法算出来的mid都是2,判断后发现arr[2]=4 < 40,需要排除左半区间,low更新为3
- 进入第二轮循环,此时有效搜索区间是
[3,4],如果用high//2,算出来的mid是4//2=2,这个索引已经被我们排除在搜索范围外了,继续判断会进入死循环,永远找不到结果;而用(low+high)//2算出来的mid是(3+4)//2=3,刚好在有效区间内,能继续缩小搜索范围直到找到值。
为什么mid = (low + high) // 2是对的
这个写法的本质是计算任意闭区间[low, high]的中间索引,不管这个区间落在整个数组的哪个位置,都能得到区间内的中间位置,保证每次都能排除一半的搜索范围,符合二分查找的核心逻辑。
小扩展:其他有整数溢出限制的语言(比如C、Java)里,更推荐写
mid = low + (high - low) // 2,避免low和high相加时超出整数最大长度溢出,Python的整数支持大数,所以不用考虑这个问题。
内容的提问来源于stack exchange,提问作者Samuel Abebe
相关产品推荐
相关产品推荐

