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

二分查找算法部分场景失效问题排查:复制《算法图解》代码后查找特定元素失败的原因分析

问题分析:二分查找无法找到目标元素的原因

你遇到的问题主要出在两个关键逻辑错误上,咱们拆解来看:

1. 中间索引计算的类型不规范

在Python 3中,(low + high)/2会返回浮点数,而列表的索引必须是整数。虽然少数场景下Python可能会隐式转换,但这是不严谨的写法,甚至会在low+high为奇数时直接抛出TypeError(比如得到49.5这种非整数索引)。正确的做法是用整数除法//,确保得到的是整数索引:

mid = (low + high) // 2

2. 搜索范围调整的逻辑错误

这是导致你找不到数字1的核心原因:当猜测的元素guess大于目标item时,说明目标肯定在mid的左侧区间,此时应该把high设置为mid - 1,而不是mid + 1。你的代码里写的high = mid + 1会直接把搜索范围跳到mid右侧,完全漏掉了左侧的元素,自然找不到位于列表最左端的1。

修正后的完整代码

def binary_search(list, item):
    low = 0
    high = len(list) - 1
    while low <= high:
        mid = (low + high) // 2  # 改用整数除法保证索引为整数
        guess = list[mid]
        if guess == item:
            return mid
        if guess > item:
            high = mid - 1  # 调整为mid-1,缩小到左半区间
        else:
            low = mid + 1
    return None

list1 = []
for i in range(1, 101):
    list1.append(i)
print(list1)
print(binary_search(list1, 1))  # 现在会正确返回索引0

验证逻辑

当查找1时,修正后的代码会逐步缩小范围:

  • 初始low=0,high=99,mid=49,guess=50>1,所以high=48
  • 接下来low=0,high=48,mid=24,guess=25>1,high=23
  • 重复这个过程,最终会定位到mid=0,guess=1,返回正确的索引0。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 10:37:51