我的作业存在问题,需要我解决类似于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
我被这个问题困扰了好几天。任何帮助将非常感激。 感谢。
答案 0 :(得分:0)
您的问题是静态范围最小查询(RMQ)。假设你有N个数字。您可以使用的最简单的算法是创建大小为N的数组并存储数字的算法,以及另一个大小为sqrtN的算法,并保存数组中每个大小为sqrtN的区间的RMQ。这应该有效,因为N不是很大,但是如果你有很多查询,你可能想要使用不同的算法
话虽这么说,您可以使用的最快算法是从数字中制作稀疏表,这将允许您回答O(1)中的查询。构造稀疏表是O(NlogN),给定N = 10 ^ 5应该没问题
最后,最终的RMQ算法使用了一个Segment Tree,它也支持更新(单个元素和范围),并且它的O(N)构造了Segment Tree,并且每个查询都有O(logN)和更新。
所有这些算法都很好地暴露here。
有关Segment Trees的更多信息,请参阅我自己编写的这些教程。
link
祝你好运!