← 中文资源

简体中文版本

固定窗口的移动平均计算

使用滚动和在固定窗口上计算简单移动平均,校验窗口大小和数值,并为每个完整窗口输出一个结果。

阅读英文原文

功能说明

移动平均可以平滑时间序列,但每次窗口重新求和会退化为 O(n*w)。该实现维护滚动和,在窗口填满后每步加入新值并减去最旧值,输出长度为 n-w+1 的数组。它适合监控指标、传感器读数和访问量的短期趋势展示。

关键代码

校验非空数组、窗口为 1 到数组长度的整数、所有值为有限数字。循环中先累加当前值,当索引达到窗口大小时减去滑出值;索引大于等于窗口减一时推入 sum 除以 window。复杂度为线性,且不修改输入数组。

for (let index = 0; index < values.length; index += 1) {
  sum += values[index];
  if (index >= window) sum -= values[index - window];
  if (index >= window - 1) result.push(sum / window);
}

使用注意

窗口必须小于等于数组长度,否则抛 RangeError。该函数只计算简单移动平均,不支持加权、中心对齐或指数平滑。结果可能出现浮点误差,展示时应统一舍入。输入数组不会被修改,但返回的数组每次都是新数组。

验证方式

断言 movingAverage([1, 2, 3, 4, 5], 3) 返回 [2, 3, 4]。窗口为 1 时返回原值副本,窗口为 5 时返回 [3]。窗口为 0 或大于数组长度抛 RangeError。包含 NaN 抛 TypeError。空数组抛 RangeError,结果长度应为 n - w + 1。