如何高效计算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
相关产品推荐
相关产品推荐

