
1) 【一句话结论】:采用分治策略递归分解数据,通过合并子问题的加权平均结果计算整体加权平均,时间复杂度优化至O(n log n),空间复杂度O(log n),且支持并行计算加速。
2) 【原理/概念讲解】:加权算术平均的核心公式为 ( \frac{\sum (x_i \cdot w_i)}{\sum w_i} )((x_i) 为数值,(w_i) 为权重)。直接遍历计算需O(n)时间,但大规模数据可通过分治优化:将数据拆分为左右子数组,分别递归计算子问题的加权平均,再合并结果。类比:计算一大袋水果的加权平均(按重量),可将袋子分成两半,分别称重计算每半的“重量-数值比”,再合并(加权平均是两半的加权平均的加权平均,即加权平均的加权平均)。分治的核心是减少重复计算,将大问题拆解为独立子问题,递归求解后合并。
3) 【对比与适用场景】:
| 方法 | 定义 | 特性 | 时间复杂度 | 空间复杂度 | 适用场景 |
|---|---|---|---|---|---|
| 直接遍历 | 逐个元素计算 (x_i \cdot w_i) 累加后除以权重和 | 简单,无额外分解 | O(n) | O(1) | 数据量小,无并行需求 |
| 分治算法 | 递归拆分数组,分别计算子加权平均,合并结果 | 递归分解,减少计算量 | O(n log n) | O(log n)(递归栈) | 大规模数据,需优化计算 |
| 并行计算 | 多线程/多进程分别计算子加权平均,再合并 | 并行处理,加速计算 | O(n)(理想并行) | O(1)(线程间通信) | 高性能计算环境,多核CPU |
4) 【示例】(伪代码):
def weighted_average(a, w):
if len(a) == 1:
return a[0] * w[0] / sum(w)
mid = len(a) // 2
left_avg = weighted_average(a[:mid], w[:mid])
right_avg = weighted_average(a[mid:], w[mid:])
left_sum = sum(w[:mid])
right_sum = sum(w[mid:])
return (left_avg * left_sum + right_avg * right_sum) / (left_sum + right_sum)
# 示例:a=[10,20,30], w=[1,2,3]
# 左子数组[10,20], w=[1,2] → 加权平均=(10*1+20*2)/(1+2)=50/3≈16.67;右子数组[30], w=[3] → 30*3/3=30;合并:(16.67*3+30*3)/(3+3)=140/6≈23.33
5) 【面试口播版答案】:
面试官您好,加权平均的计算公式是各数值乘以权重求和后除以权重总和。直接遍历计算需要O(n)时间,对于大规模数据(比如百万级),我们可以用分治算法优化。具体来说,将数据分成左右两部分,分别递归计算子问题的加权平均,然后合并结果。比如,假设数组长度为n,递归分解后,每个子问题的计算时间是O(n/2),递归深度为log n,总时间复杂度是O(n log n)。空间复杂度是O(log n)因为递归栈。此外,分治算法天然支持并行计算,比如将左右子数组分配给不同线程处理,最后合并结果,这样在多核CPU上能显著加速。总结来说,分治结合并行是高效计算加权平均的方案,时间复杂度O(n log n),空间O(log n),适用于大数据量场景。
6) 【追问清单】:
7) 【常见坑/雷区】: