You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中计算列表Moving Sum(滑动窗口和)是否有更优实现方案?

Flutter中更高效的滑动窗口和计算方法

你的当前实现每次循环都通过getRange截取子列表再调用reduce求和,这种方式的时间复杂度是O(n*window)——当列表长度n或窗口大小window较大时,会重复计算大量重叠元素的和,效率很低。

更高效的方式是利用滑动增量计算,时间复杂度可以降到O(n)。核心思路是:

  • 先计算第一个完整窗口的和
  • 后续每个窗口的和 = 前一个窗口的和 - 移出窗口的左侧元素 + 新进入窗口的右侧元素

优化后的代码如下:

List<double?> rollingSum({int window = 3, required List<double> data}) {
  final sumList = <double?>[];
  final dataLength = data.length;

  // 处理边界情况:窗口大小小于1或数据为空
  if (window < 1 || dataLength == 0) {
    return List.filled(dataLength, null);
  }

  // 填充前window-1个null
  for (int i = 0; i < window - 1; i++) {
    sumList.add(null);
  }

  // 计算第一个窗口的和
  double currentSum = 0;
  for (int i = 0; i < window; i++) {
    currentSum += data[i];
  }
  sumList.add(currentSum);

  // 滑动计算后续窗口的和
  for (int i = window; i < dataLength; i++) {
    currentSum = currentSum - data[i - window] + data[i];
    sumList.add(currentSum);
  }

  return sumList;
}

补充说明:

  • 将data参数改为required List<double>,保证类型安全,避免运行时类型错误
  • 提前处理了边界情况(窗口无效或空数据),鲁棒性更强
  • 避免了频繁的子列表截取和重复遍历,在大数据量场景下性能提升显著

内容的提问来源于stack exchange,提问作者bky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 15:25:09