
1) 【一句话结论】:计算加权平均指数时,通过增量更新(仅处理价格/权重变化的股票,累加加权乘积变化)和缓存(存储当前价格与加权乘积),将计算量从全量遍历的O(N)降低至O(变化股票数),显著提升效率,适用于数据量大的场景。
2) 【原理/概念讲解】:加权平均指数公式为 ( I = \frac{\sum w_i p_i}{\sum w_i} ),其中 ( w_i ) 是股票权重,( p_i ) 是价格。全量计算需遍历所有N支股票,计算每个的 ( w_i p_i ),效率低。增量计算思路:维护总分子(( \sum w_i p_i ))和总分母(( \sum w_i )),仅当股票价格或权重变化时,更新其对应的 ( w_i p_i ) 项,累加到总分子,分母若权重固定则不变。类比:购物车结算,只加新买的商品,不用每次清空重新算总价,减少重复计算。
3) 【对比与适用场景】:
| 方法 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 全量计算 | 每次重新计算所有股票的 ( w_i p_i ),更新分子分母 | 计算量与N成正比,需遍历所有股票 | 数据量小,股票权重/价格变化频率低 | 处理速度慢,数据量大时效率低 |
| 增量计算 | 仅更新价格/权重变化的股票的 ( w_i p_i ) 项,累加到总分子和分母 | 计算量与变化股票数成正比,减少遍历次数 | 数据量大,股票频繁变动(如交易记录多) | 需维护变化记录,可能存在延迟 |
4) 【示例】:伪代码示例(处理价格更新):
def update_index(price_updates):
total_weight = 0 # 总权重(权重固定则不变)
total_weighted_price = 0 # 总加权价格
cache = {} # 缓存:股票id -> (权重, 当前价格, 当前加权乘积)
for stock_id, new_price in price_updates:
if stock_id in cache:
old_weight, old_price, old_wp = cache[stock_id]
new_wp = old_weight * new_price
total_weighted_price += (new_wp - old_wp) # 累加变化量
cache[stock_id] = (old_weight, new_price, new_wp) # 更新缓存
else:
weight = get_weight(stock_id) # 获取权重
new_wp = weight * new_price
total_weighted_price += new_wp
cache[stock_id] = (weight, new_price, new_wp)
total_weight += weight # 累加权重(权重固定则分母不变)
index_value = total_weighted_price / total_weight
return index_value
5) 【面试口播版答案】:
面试官您好,计算加权平均指数时,核心是优化计算效率,避免全量重新计算。对于N=300的成分股,每天数百万交易记录,我会采用增量更新策略:只处理价格或权重发生变化的股票,更新其加权乘积(( w_i p_i )),累加到总分子和分母。同时,缓存每个股票的当前价格和加权乘积,避免重复计算。具体来说,当股票价格更新时,计算新旧乘积的差值,加到总分子,分母则累加所有股票的权重(权重固定则分母不变)。这样,计算量从O(N)降到O(变化股票数),显著提升效率。比如,如果只有10支股票价格变动,只需处理10次乘积更新,而非300次,大大减少计算量。
6) 【追问清单】:
7) 【常见坑/雷区】: