【发布时间】:2017-02-10 09:38:12
【问题描述】:
假设我有一个长度为N 的整数数组A,我也有一个整数L N。
我试图找到的是范围 [0, L-1], [1,L], [2,L+1]....[N-L,N-1] 的最小值
(就像一个长度为L的从左到右移动的窗口)
我的算法现在是 O(N lg N) 和 O(N lg N) 预处理:
- 将所有号码
A[0...L-1]保存在多组S中,同时将号码按顺序存储在队列Q中。 [0, L-1] 的最小值只是S的第一个元素。 O(N lg N) - 弹出
Q的第一个元素,在S中找到这个元素并删除。然后将A[L]推入S。 [1, L] 的最小值只是S的第一个元素。 O(lg N) - 对所有可能的范围重复第 2 步,每次迭代移动到下一个元素。 O(N)
总计为 O(N lg N)。
我想知道是否有任何算法可以达到比这更好的要求:
- 预处理时间(如果需要)为 O(N)
- O(1) 的查询时间
我对 RMQ 做了一些研究,我发现最近的方法是使用稀疏表,它实现 O(1) 查询时间但 O(N lg N) 预处理时间。 reduce RMQ to LCA问题的另一种方法可以满足要求,但需要对数组A进行一些限制。
那么有没有可能,不限制A,在解决我的问题时可以满足要求?
【问题讨论】: