Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 伪范围最小查询_Java_Algorithm_Stack_Rmq - Fatal编程技术网

Java 伪范围最小查询

Java 伪范围最小查询,java,algorithm,stack,rmq,Java,Algorithm,Stack,Rmq,我的作业有一个问题,需要我解决一个类似于最小范围查询的问题。问题大致描述如下: 我应该编写一个java程序,读取大量整数(大约100000个),并将它们存储到一些数据结构中。然后,我的程序必须回答给定范围[i,j]内最小数的查询。我已经成功地设计了一个算法来解决这个问题。然而,这还不够快 我的算法的伪代码如下所示: // Read all the integers into an ArrayList // For each query, // Read in range values [i,j

我的作业有一个问题,需要我解决一个类似于最小范围查询的问题。问题大致描述如下:

我应该编写一个java程序,读取大量整数(大约100000个),并将它们存储到一些数据结构中。然后,我的程序必须回答给定范围[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]
有人能告诉我怎么做才能使我的算法足够快来解决这个问题吗

可以在以下链接中找到分配文件:

这个问题困扰了我好几天了。任何帮助都将不胜感激。
谢谢。

您的问题是静态范围最小查询(RMQ)。假设你有N个数字。您可以使用的最简单的算法是创建一个大小为N的数组并存储数字的算法,以及另一个大小为sqrtN的算法,该算法将保存数组中每个大小为sqrtN的间隔的RMQ。这应该可以工作,因为N不是很大,但是如果您有许多查询,您可能需要使用不同的算法。
这就是说,您可以使用的最快算法是用数字生成一个稀疏表,这将允许您回答O(1)中的查询。构造稀疏表是O(NlogN),给定N=10^5,这应该很好。
最后,最终的RMQ算法是使用一个段树,它也支持更新(单个元素以及范围),它是O(N)来构造段树,并且每次查询和更新都是O(logN)。 所有这些算法都是公开的。 有关片段树的更多信息,请参阅我自己编写的这些教程。

祝你好运

您的问题听起来很像范围最小查询,有足够的材料可供使用。例如,见。谢谢你的文章。我觉得这很有帮助。是否可以使用基于堆栈的解决方案来解决此问题?我想知道这一点,因为任务简介实际上说明不需要rmq,一个堆栈就足以解决问题。如果你被告知使用堆栈,我猜你错过了问题描述的一些细节或描述不正确,因为,如上所述,这是rmq,我不相信有一个有效的基于堆栈的解决方案(据我们所知)。感谢有用的链接。它们看起来确实很有趣。当我有更多空闲时间时,我将尝试实施段树/稀疏表解决方案。无论如何,我通过将大小为N的输入数据预处理为大小为N的段(立方根N)来解决这个问题。这是Dukeling提供的链接中所述的RMQ方法之一。做得好,最好的解决方案并不总是最快或最复杂的解决方案,而是以最简单的方式解决特定问题的解决方案。另一方面,我建议学习段树,因为它是一种非常通用的数据结构,适用于许多范围查询(如范围和查询,甚至GCD查询)