0

我的作业有问题,需要我解决类似于 range-minimum-query 的问题。问题大致描述如下:

我应该编写一个 java 程序,它读取大量整数(大约 100,000)并将它们存储到一些数据结构中。然后,我的程序必须回答给定范围 [i,j] 中的最小数字的查询。我已经成功地设计了一种算法来解决这个问题。但是,它还不够快。

我的算法的伪代码如下:

// Read all the integers into an ArrayList

// For each query,
// Read in range values [i,j] (note that i and j is "actual index" + 1 in this case)
// Push element at index i-1 into a Stack
// Loop from index i to j-1 in the ArrayList (tracking the current index with variable k)
[Begin loop]       
// If element at k is lesser than the one at the top of the stack, push the element at k into the Stack.
[End of loop]

有人可以告诉我我能做什么,以便我的算法足够快来解决这个问题吗?

可以在此链接中找到分配文件:http: //bit.ly/1bTfFKa

我已经被这个问题难住了好几天。任何帮助将非常感激。谢谢。

4

1 回答 1

0

您的问题是静态范围最小查询 (RMQ)。假设你有 N 个数字。您可以使用的最简单的算法是创建一个大小为 N 的数组并存储数字的算法,另一个是大小为 sqrtN 的算法,并将保存数组中每个大小为 sqrtN 的间隔的 RMQ。这应该可行,因为 N 不是很大,但如果您有很多查询,您可能需要使用不同的算法。
话虽如此,您可以使用的最快算法是用数字制作一个稀疏表,这将允许您回答 O(1) 中的查询。构造稀疏表是 O(NlogN) ,给定 N = 10^5 应该没问题。
最后,最终的 RMQ 算法是使用 Segment Tree,它也支持更新(单元素和范围),构建 Segment Tree 的时间为 O(N),每次查询和更新的时间为 O(logN)。所有这些算法在这里都得到了很好的展示。有关分段树的更多信息,请参阅我自己编写的这些教程。 链接
祝你好运!

于 2013-10-16T13:45:38.140 回答