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

如何高效计算Python列表中所有元素两两差值的平均值

高效计算列表元素两两差值的平均值

优化思路:数学简化 + 前缀和

两层循环遍历所有元素对的时间复杂度是O(n²),当列表规模较大时效率极低。我们可以通过排序结合前缀和将时间复杂度降至O(n log n)(主要开销来自排序),核心是用数学公式简化差值总和的计算:

假设列表排序后为sorted_arr,对于第i个元素(索引从0开始),它需要和后面的n - i - 1个元素计算差值(即sorted_arr[i] - sorted_arr[j],其中j > i)。所有差值的总和可以拆解为:
总差值 = Σ( sorted_arr[i] * (n - i - 1) - 从i+1到末尾的元素和 )
利用前缀和数组可以快速获取任意区间的元素和,避免重复计算。

代码实现

arr = [110, 60, 30, 10, 5]
sorted_arr = sorted(arr)
n = len(sorted_arr)

# 构建前缀和数组:prefix_sum[k] 表示前k个元素的累加和(prefix_sum[0] = 0,prefix_sum[1] = sorted_arr[0])
prefix_sum = [0] * (n + 1)
for i in range(n):
    prefix_sum[i+1] = prefix_sum[i] + sorted_arr[i]

total_diff = 0
for i in range(n):
    # 当前元素需要计算差值的后续元素数量
    num_rest = n - i - 1
    # 后续所有元素的总和
    sum_rest = prefix_sum[-1] - prefix_sum[i+1]
    total_diff += sorted_arr[i] * num_rest - sum_rest

# 总共有 n*(n-1)/2 个差值对
average = total_diff / (n * (n - 1) / 2)
print(average)  # 输出 38.0

结果验证(对比原始循环)

用你原来的两层循环方法验证结果一致:

arr = [110, 60, 30, 10, 5]
total = 0
count = 0
for i in range(len(arr)):
    for j in range(i+1, len(arr)):
        total += arr[i] - arr[j]
        count += 1
print(total / count)  # 同样输出 38.0

效率对比

  • 原始两层循环:时间复杂度O(n²),当n=1000时,需要计算约50万次差值;
  • 优化方法:时间复杂度O(n log n),n=成 Commercial**到n,BDDScottEND+名字禁unkting,计算量大幅降低。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 15:48:05