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

修复Binary Search索引错误后运行时长增加问题求助

问题分析与解决

原代码的核心错误

原代码触发IndexError的根本原因是错把low和high初始化为列表的元素值,而非索引:

if low is None:
    low = list[0]  # 取的是第一个元素的值,不是索引0
if high is None:
    high = list[-1]  # 取的是最后一个元素的值,不是索引len(list)-1

二分查找中,low和high必须代表当前查找范围的索引边界。如果列表元素是负数或远大于列表长度的数值,计算出的midpoint会远远超出列表的索引范围,直接导致索引越界。

你修改后的逻辑错误

你将判断条件改成和midpoint(索引值)比较,完全偏离了二分查找的核心逻辑:

if midpoint == target:  # 错误:应比较midpoint位置的元素与目标值
elif target < midpoint:

这种修改让代码彻底脱离了二分查找的区间缩小逻辑,变成无意义地比较目标值和索引值,导致midpoint持续增长,查找退化为低效遍历,所以单次耗时高达3秒。

修正后的完整代码

import random
import time

def binary_search(list, target, low=None, high=None):
    if low is None:
        low = 0  # 初始化索引下界
    if high is None:
        high = len(list) - 1  # 初始化索引上界
    midpoint = (low + high) // 2

    if high < low:
        return print("Target was not in the list")
    if list[midpoint] == target:
        return midpoint
    elif target < list[midpoint]:
        return binary_search(list, target, low, midpoint - 1)
    else:
        return binary_search(list, target, midpoint + 1, high)

if __name__ == '__main__':
    length = 100
    sorted_list = set()
    while len(sorted_list) < length:
        sorted_list.add(random.randint(-3*length, 3*length))
    sorted_list = sorted(list(sorted_list))

    start = time.time()
    for target in sorted_list:
        binary_search(sorted_list, target)
    end = time.time()
    print("Binary search time: ", (end - start)/length, "seconds")

修正后的效果

修正后,代码会按照索引范围正常缩小查找区间,单次查找耗时会降到微秒级,符合二分查找O(log n)的时间复杂度预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 02:37:34