9

我正在尝试按照移动平均线来实现一些东西。

在这个系统中,不能保证每个时间段的整数数量。我确实需要计算每个时期的平均值。因此,我不能简单地按数量滑过整数列表,因为这与时间无关。

我可以记录每个值及其相关时间。我们将有大量数据在系统中运行,因此“垃圾收集”旧数据非常重要。

还需要注意的是,我需要在每个周期结束后将平均值保存到磁盘中。但是,它们可能在将数据保存到磁盘和引入新时期的数据之间存在一些重叠。

我可以使用哪些有效的数据结构来存储、滑动和垃圾收集此类数据?

4

1 回答 1

8

问题的描述和问题的冲突:所描述的不是移动平均值,因为每个时间段的平均值是不同的。(“我需要计算每个时期的平均值。”)所以这承认了一个真正微不足道的解决方案:

对于每个时期,保持一个计数和观察的总和。

在期末,计算平均值

我怀疑实际想要的是:每一秒(计算周期),我想知道过去一分钟(聚合周期)的平均观察值。

这可以通过桶的循环缓冲区简单地解决,每个桶代表一个计算周期的值。会有aggregation period / computation period这样的桶。同样,每个桶都包含一个计数和一个总和。此外,维护当前的总和/和和累积的总和/计数。每个观察值都添加到当前总计/总和中。

在每个计算周期结束时:

  • 从累计总和/计数中减去(循环)第一期的总和/计数
  • 将当前总和/计数添加到累积总和/计数
  • 根据累积总和/计数报告平均值
  • 用当前总和/计数替换第一个周期的值
  • 清除当前总和/计数
  • 提前循环缓冲区的原点。

如果您确实需要能够随时计算某个给定时期内先前观察的所有平均值,则您需要一个更复杂的数据结构,基本上是一个可扩展的循环缓冲区。然而,这种精确的计算实际上很少需要,并且根据上述算法,分桶近似通常足以满足数据目的,并且在内存管理的长期内更具可持续性,因为它的内存需求从一开始就固定.

于 2013-10-15T16:59:19.400 回答