Stream 在不存储N个项目的流中查找最后一个项目,但为N

Stream 在不存储N个项目的流中查找最后一个项目,但为N,stream,Stream,假设有一个数据流到达,D(0),D(1),D(2)。。。。当D(i)到来时,我想知道D(i-N)。最直接的方法是存储最近的N项,并在新数据到达时不断更新它们。但问题是N可能很大,因此没有足够的内存来存储它们。通过存储比N少得多的项目,是否可以实现这一点?一个常数M不是我所能看到的,除非你可以利用数据中的一些规律性。如果数据是完全随机的(这样就不能从其他元素中推断出任何元素),那么选择不保存元素k将使得不可能在迭代k+N中再现该元素 相反,请考虑: 你能减少N吗 您是否可以将信息存储在磁盘上,或

假设有一个数据流到达,D(0),D(1),D(2)。。。。当D(i)到来时,我想知道D(i-N)。最直接的方法是存储最近的N项,并在新数据到达时不断更新它们。但问题是N可能很大,因此没有足够的内存来存储它们。通过存储比N少得多的项目,是否可以实现这一点?一个常数M不是我所能看到的,除非你可以利用数据中的一些规律性。如果数据是完全随机的(这样就不能从其他元素中推断出任何元素),那么选择不保存元素k将使得不可能在迭代k+N中再现该元素

相反,请考虑:

  • 你能减少N吗
  • 您是否可以将信息存储在磁盘上,或者(如果您在嵌入式环境中)存储在速度较慢、成本较低的内存上
  • 数据中是否存在某种模式?例如,如果存在重复模式,则可以利用该模式,或者如果数字之间存在某种数学关系,则某些公式可能有助于从其他数字重建一个数字。即使没有可感知的模式,也许您可以使用一些压缩算法来减少数据大小
  • 数据是否有一些限制,例如每个数字都在0到255之间?如果是这样,您也许可以减少存储需求

(顺便问一下,这有什么用?

我在估计传感器网络中e2e延迟的分位数。因为我只关心最近N个项目的e2e延迟,所以随着e2e延迟样本的不断到来,我将移动一个大小为N的窗口。当样本D(i)出现时,我将其放入窗口并逐出D(i-N),这两种情况都符合逻辑,因为我无法保存整个样本窗口。@sinoTrinity:Hm-我不擅长统计,但这篇文章的重点不在于,使用它们描述的算法,您只需要存储几个值,而不是所有的N个值吗?(你只存储几个值的代价是你只得到了一个分位数的近似值——我的陈述是你需要存储所有的值,假设你想要一个依赖于所有N个值的精确结果。)是的,这都是估计。P2估计到目前为止看到的所有样本的分位数。它包括所有的历史。但我只想估计最近N个样本的分位数,因为很久以前发生的事情可能根本没有意义。@sinoTrinity:啊,现在我想我明白了-所以你需要存储这些值,因为你想在元素太旧时以某种方式从估计中“删除”每个元素?在这种情况下,我认为我的原始论点适用:如果不实际保存值,就无法恢复该值。因此,除非有一个版本的P2算法被专门为这个场景量身定做,否则我认为你需要存储所有的n个值。对前N个元素运行P2算法以获得分位数。然后,重新启动算法并在接下来的N个元素上运行它。这样,在每N个元素之后只会得到更新的分位数。如果这太少,但您可以在每M个元素之后进行更新,则运行该算法的N/M个实例,每个实例在前一个元素之后启动M个元素,然后每M重置一次。内存消耗:5*N/M。给定一个应用程序,N是固定的。但与可用内存相比,它相对较大。具体地说,我需要N大约1000。