performance - 计算移动最大值

标签 performance algorithm data-structures max

<分区>

Possible Duplicate:
Find the min number in all contiguous subarrays of size l of a array of size n

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

更直接地说,我可以定义一个新数组 out[k-w+1] = max{data[k-w+1,...,k]}对于 k >= w-1 (这假设数组从 0 开始,就像在 C++ 中一样)。

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

[我希望 N 中应该有一个线性的不依赖w ,就像移动平均线,但找不到它。对于 N log(w)我认为有一种方法可以使用排序的数据结构进行管理 insert() , delete()extract_max()一共在log(w)或小于 w 的结构-- 例如,像排序的二叉树]。

非常感谢。

最佳答案

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

  • Enqueue,向结构中添加新元素,
  • Dequeue,从结构中移除最旧的元素,以及
  • Find-max,返回(但不删除)结构中的最小元素。

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

希望这对您有所帮助!

关于performance - 计算移动最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8905525/

相关文章:

performance - 搜索和排序立方体面积的算法

algorithm - 按组件排序多值 (SIMD) 数组

algorithm - 从一组范围中找到最频繁的数字 -

algorithm - 预序和与中序遍历的关系

algorithm - 插入 BST 时,插入的第一项是否总是树的根?

c# - 在不使用 GDI+/WPF 的情况下,C# 中的快速+高质量图像大小调整算法

java - 程序超过理论内存传输率

algorithm - 确定一个符号是否是第 i 个组合 nCr 的一部分

java - Max Heap和sorted stack的区别

mysql - 确定 n 维中点之间的距离