You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

迭代二分搜索算法中high取值疑问:为何优先选len(data)-1?

为什么二分搜索里high = len(data)-1是更标准的写法?

嘿,这个问题问得特别到位!虽然你写的两种写法看起来都能“正常运行”,但high = len(data)-1确实是更稳妥、更主流的选择,咱们来一步步拆解原因:

  • 彻底避免数组索引越界风险
    你第一段代码里high = len(data)的写法有个隐藏bug:当搜索目标比数组所有元素都大时,循环会走到low = len(data)、high = len(data)的状态,此时计算mid = (low + high) // 2会得到len(data),而数组的合法索引范围是0到len(data)-1,这时候访问data[mid]就会直接抛出索引越界错误。
    而high = len(data)-1的写法从一开始就把搜索范围限制在合法索引内,所有mid的计算结果都不会超出数组的有效索引,从根源上杜绝了这个问题。

  • 搜索区间的语义更直观清晰
    high = len(data)-1对应的是闭区间搜索,也就是我们的搜索范围是[low, high]——这个区间里的每一个索引都对应数组中存在的元素,逻辑上非常直观:只要low <= high,说明区间里还有元素可以搜索。
    而high = len(data)对应的是左闭右开区间[low, high),此时high本身并不是一个合法的数组索引,这会让循环条件和区间更新逻辑变得更绕(比如正确的左闭右开写法循环条件应该是low < high,且high的更新方式要改成high = mid而非mid-1),增加了出错的概率。

  • 和行业惯例、经典实现保持一致
    几乎所有经典算法教材(比如《算法导论》)、主流编程语言的内置二分搜索工具(比如Python的bisect模块)都采用闭区间的写法。使用这种标准写法,既能让你在阅读他人代码或参考资料时不需要额外转换思路,也能让自己的代码更容易被其他开发者理解和维护。

举个实际测试的例子:用你的第一段代码搜索data = [1,3,5]中的6,程序会在循环中计算出mid = 3,然后尝试访问data[3],直接触发IndexError;而第二段代码则会正常循环到low > high,返回False,完全没有问题。

内容的提问来源于stack exchange,提问作者jay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 17:18:01