小编典典

计算最大移动量

algorithm

我有一个(大型)数字数据(size N)数组,想计算一个固定窗口大小的运行最大值数组w

更直接地,我可以out[k-w+1] = max{data[k-w+1,...,k]}为其定义一个新数组k >= w-1(这与C
++一样,假设是基于0的数组)。

有没有比这更好的方法N log(w)呢?

[我希望应该有一个N不依赖的线性变量w,例如移动平均线,但找不到它。因为N log(w)我认为有一种方法可以管理排序的数据结构,该结构可以做到insert()delete()并且extract_max()完全在log(w)大小结构上w(例如,排序的二叉树),或者更少]。

非常感谢你。


阅读 249

收藏
2020-07-28

共1个答案

小编典典

确实有一种算法可以在O(N)时间内完成此操作,而无需依赖于窗口大小w。这个想法是使用一个聪明的数据结构来支持以下操作:

  • Enqueue ,它为结构添加了新元素,
  • Dequeue ,它从结构中删除最旧的元素,并
  • Find-max ,它返回(但不删除)结构中的最小元素。

本质上,这是一个队列数据结构,支持对最大元素的访问(但不删除)。令人惊讶的是,如
先前的问题所示
,可以实现此数据结构,以使这些操作中的每一个都在O(1)摊销时间内运行。结果,如果使用此结构将w个元素排入队列,然后在需要时调用find-
max的同时连续将另一个元素排入队列并排入结构,则将只花费O(n +
Q)时间,其中Q是您提出的查询。如果只关心每个窗口的最小值,则最终为O(n),与窗口大小无关。

希望这可以帮助!

2020-07-28