移动窗口的最小值/最大值是否可以达到O(N)?
我有input数组A.
A[0], A[1], ... , A[N-1]
我想要返回B的函数Max(T,A)代表A的大小在上一个大小为T的移动窗口上的最大值
B[i+T] = Max(A[i], A[i+T])
通过使用最大堆来跟踪当前移动窗口A [i]到A [i + T]的最大值,该algorithm产生O(N log(T))最坏的情况。
我想知道有没有更好的algorithm? 也许是一个O(N)algorithm
O(N)使用Deque数据结构是可能的。 它拥有对(价值;指数)。
at every step: if (!Deque.Empty) and (Deque.Head.Index <= CurrentIndex - T) then Deque.ExtractHead; //Head is too old, it is leaving the window while (!Deque.Empty) and (Deque.Tail.Value > CurrentValue) do Deque.ExtractTail; //remove elements that have no chance to become minimum in the window Deque.AddTail(CurrentValue, CurrentIndex); CurrentMin = Deque.Head.Value //Head value is minimum in the current window
它被称为RMQ(范围最小查询)。 其实我曾经写过一篇文章(用c ++代码)。 请参阅http://attiix.com/2011/08/22/4-ways-to-solve-%C2%B11-rmq/
或者您可能更喜欢维基百科, 范围最小查询
在准备之后,你可以得到O(1)
中任何给定范围的最大数目,