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

Python实现双列表求和匹配二分查找运行速度过慢原因问询

核心问题

你犯了一个非常典型的逻辑错误:对s2的排序操作被放在了循环内部,每次遍历s1的元素都会重新排序一次s2。
你写的binary_search函数中,sorted(s2)被放在了生成器表达式的循环体里,假设s1长度为n,你就会执行n次O(n log n)的排序操作,整体时间复杂度直接变成O(n² log n),远高于暴力解法的O(n²),自然耗时更长。

修正方法

只需要把s2的排序操作提到循环外部,整个算法的时间复杂度就能回到你预期的O(n log n):

def find_in(s, s2):
    start, end = 0, len(s2)-1
    while end >= start:
        mid = start + (end - start) // 2
        if s2[mid] == s:
            return True
        elif s2[mid] > s:
            end = mid - 1
        else:
            start = mid + 1
    return False

@timing
def binary_search(x : int, s1 : list, s2 : list) -> bool:
    # 提前排序,仅执行一次
    sorted_s2 = sorted(s2)
    return any(find_in(x - s, sorted_s2) for s in s1)

进一步优化建议

  • 优先用Python标准库的bisect模块实现二分查找,它是C语言实现的,比纯Python手写的二分查找效率高很多:
import bisect

def find_in(s, s2_sorted):
    idx = bisect.bisect_left(s2_sorted, s)
    return idx < len(s2_sorted) and s2_sorted[idx] == s
  • 如果没有必须用二分查找的要求,用哈希集合实现的时间复杂度可以降到O(n),效率更高:
@timing
def set_solution(x : int, s1 : list, s2 : list) -> bool:
    s2_set = set(s2)
    return any(x - s in s2_set for s in s1)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 04:48:01