功能说明
示例用 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 或大于数组长度,可验证边界返回空或原值。