范围最小查询<o(n),o(1)=“”>方法(查询)</o(n),>

时间:2013-02-09 04:42:40

标签: algorithm rmq

继续我的最后两个问题,“Range Minimum Query approach (from tree to restricted RMQ)”和“Range Minimum Query approach (Last steps)

我在TopCoder上关注了this tutorial,并在最后一节介绍了该方法。

现在假设我完成了所有工作,并准备好进行查询。根据教程,这是我应该做的:

  

i和j在同一个块中,因此我们使用P和T

中计算的值

例如,如果有这样的块:

000111

最小值当然位于第三个0,但如果i和j类似于4和6,则第三个0不会出现在查询的标准中。我的理解错了吗?

  

i和j在不同的块中,因此我们计算三个值:   使用P和T,最小值从i到i的块的最小值   使用A'上的预计算查询在i和j的块之间的所有块   从j的块开始到j的最小值,再次使用T和   P:最后返回总体最小值使用的位置   你计算的三个值。

为什么计算从i到i的块结尾的最小值和j的块到j的最小值?两个人的答案都不在于我... j?另外,如果不像最后一个问题那样完全合适,该如何做到这一点。

1 个答案:

答案 0 :(得分:3)

  

最小值当然位于第三个0,但如果i和j类似于4和6,则第三个0不会出现在查询的标准中。我的理解错了吗?

我们的想法是为每个可能的块中的所有索引对预先计算RMQ。因此,无论您在该块中查询哪些索引,都应该始终能够在O(1)时间内读取块中两个值的RMQ。在您在问题中列出的情况下,索引4和6不包含最小块的事实是真实的但无关紧要。您已经为索引4和6预先计算了RMQ。

  

为什么计算从i到i的块结尾的最小值和j的块到j的最小值?两个人的答案都不在于我... j?另外,如果不像最后一个问题那样完全合适,该如何做到这一点。

考虑这张照片:

+------+------+------+------+------+------+
| ?i?? | ???? | ???? | ???? | ??j? | ???? |
+------+------+------+------+------+------+
   ^                            ^
   i                            j

如果你想解决RMQ(i,j),那么最小值可能是三个地方之一:

  • 在与i相同的块中,在从其块内的i位置到其块末尾的索引处,
  • 在与j相同的块中,在从0到其块内j的位置的索引处,或
  • 在中间三个街区之一的某处。

该算法通过使用预先计算的表来解决前两种情况中的问题,然后使用另一种算法来解决第三种情况。这三个中的最小值应该是你的答案。

希望这有帮助!这绝不是一个简单的算法,所以如果您需要帮助,请随时在这里提出更多问题!