Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 随时间滑动窗口-数据结构和垃圾收集_Algorithm_Data Structures_Jvm_Sliding Window - Fatal编程技术网

Algorithm 随时间滑动窗口-数据结构和垃圾收集

Algorithm 随时间滑动窗口-数据结构和垃圾收集,algorithm,data-structures,jvm,sliding-window,Algorithm,Data Structures,Jvm,Sliding Window,我正试图按照移动平均线来实现一些东西 在这个系统中,不保证每个时间段有一定数量的整数。我确实需要计算每个时段的平均值。因此,我不能简单地按数量滑动整数列表,因为这与时间无关 我可以保存每个值及其相关时间的记录。我们将有大量数据在系统中运行,因此对旧数据进行“垃圾收集”非常重要 还需要注意的是,我需要在每个周期结束后将平均值保存到磁盘。但是,在将数据保存到磁盘和使用新时期的数据之间可能存在一些重叠 我可以使用哪些有效的数据结构来存储、滑动和垃圾收集此类数据?问题描述和问题冲突:所描述的不是移动平均

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

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

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

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


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

问题描述和问题冲突:所描述的不是移动平均值,因为每个时间段的平均值是不同的。(“我需要计算每个周期的平均值。”)这样就有了一个非常简单的解决方案:

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

在期末,计算平均值

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

这可以简单地用一个桶的循环缓冲区来解决,每个桶代表一个计算周期的值。将有
聚合期/计算期
这样的桶。同样,每个bucket都包含一个count和一个sum。此外,还保留了当前总计/总数和累计总计/计数。每个观测值都将添加到当前的总计/总和中

在每个计算周期结束时:

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

如果您真的需要能够在任何时候计算某个给定时间段内所有先前观测值的平均值,那么您需要一个更复杂的数据结构,基本上是一个可扩展的循环缓冲区。然而,这种精确计算实际上很少必要,根据上述算法,屈曲近似通常足以用于数据目的,并且在长期内存管理中更具可持续性,因为它的内存需求从一开始就是固定的。

我提供了一个答案,这实际上只是对您真正需求的猜测。如果我弄错了,请告诉我,我会删除它。提醒我(应用这个问题的答案应该很简单)。@rici-事实上,你搞定了。谢谢你的“字里行间阅读”!就实际的数据结构而言,链表很容易实现,因为您只是不断地在它的末尾添加新的时段。当您需要“垃圾收集”旧数据时,只需删除链表中的元素,直到达到所需的时间段。我不认为列表必须是循环的。@andyG:您可以使用链表,但列表中的句点数是恒定的,因此根本不需要内存管理。循环缓冲区是一种非常简单的数据结构(只需使用i%n作为索引)。如果希望保留所有观察结果,则链表会更简单,但开销相当大,因为每个节点的有效负载大小都相当于一个指针,并且最终会得到一个分配节点的缓存不友好的集合。您可以将循环缓冲区视为优化内存管理的一种方法。感谢您澄清这不是移动平均值。我想我需要温习一下我的术语。如果你对标题有任何建议,那么我不会让未来的访问者感到困惑,请让我知道@rici:我的印象是OP希望保持所有时期的平均值,而不仅仅是当前的平均值。循环缓冲区现在有意义了。