← 中文资源

简体中文版本

用迭代器计算滑动窗口统计

使用 slice::windows 把序列切成固定长度窗口,再通过迭代器映射计算移动平均和窗口最大值,无需手写下标循环。

阅读英文原文

功能说明

示例用 slice 的 windows 方法把序列切成固定长度的连续窗口,再通过迭代器计算移动平均与窗口最大值。rolling_average 对每个窗口求和后除以窗口长度,rolling_max 复制元素后取最大值。窗口为空或长度超过输入时直接返回空 Vec,避免 windows(0) 触发 panic。

关键代码

values
    .windows(window)
    .map(|chunk| chunk.iter().sum::<f64>() / window as f64)
    .collect()

windows 返回的是切片视图,不会复制原数据;map 与 collect 只在消费时计算,链式写法没有中间集合。

使用注意

  • window 必须大于 0,示例在入口做了长度检查,否则标准库会 panic。
  • 返回长度是 values.len() - window + 1,窗口越长结果越少。
  • sum::<f64>() 的累加顺序固定,浮点误差仍可能存在,金额场景应使用定点数。
  • 窗口最大值用 copied() 复制 i64,避免持有引用导致借用冲突。
  • 数据量极大且只需要单个统计量时,可以改用一次遍历的滑动算法,避免每个窗口重复求和。

验证方式

示例输入 [3, 5, 7, 9, 11]、窗口 3,移动平均应为 [5.0, 7.0, 9.0];最大值输入窗口 2 应得到 [4, 7, 7, 9, 9]。把窗口改为 1 或大于数组长度,可验证边界返回空或原值。