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

时间:2013-02-09 03:31:57

标签: algorithm rmq

接上我的上一个问题“Range Minimum Query approach (from tree to restricted RMQ)”(建议读一读)

再次,从TopCoder的this tutorial开始,我在这里和那里有几个问题,我希望有人可以清除它们。

因此,我将RMQ(范围最小查询)问题转换为LCA(最低公共祖先)问题,然后将其转换回来,我可以拥有一个简化的数组。 (两个转换都可以在教程中找到,简化的数组是在“从LCA到RMQ”中讨论的数组L)

无论如何,我可以使用Euler Tour获得该数组,这是所有计算的核心部分。

首先,我需要通过使整个数组只包含1和-1来使其更简单,所以这就是我所做的:Ls[i] = L[i] - L[i-1]

第二步实际上是分区,这很简单,但是第三步让我感到困惑。

  

设A'[i]为A和B [i]中第i个块的最小值   该最小值在A中的位置。

A指的是这个句子中的L数组,所以最小值总是1或-1,并且会有多个1和-1。这使我感到困惑,因为我认为这不会使计算更容易。

第四步,

  

现在,我们使用第1节中描述的ST算法预处理A'。   这将花费O(N / l * log(N / l))= O(N)时间和空间。

如果A'只保留1s和-1s的记录,那么对它做任何事都没用。

最后一步,

  

要索引表P,预处理A中每个块的类型并存储它   在数组T [1,N / l]中。块类型是通过获得的二进制数   用0代替-1,用1代替+1。

这是什么意思?要计算每种组合?比如,000 - 001 -.....?

看起来好像有多个问题,但我希望有人可以带我走完这些最后的步骤。谢谢!

1 个答案:

答案 0 :(得分:5)

希望这有助于解释事情。

  

A指的是这个句子中的L数组,所以最小值总是1或-1,并且会有多个1和-1。这使我感到困惑,因为我认为这不会使计算更容易。

我认为作者在这里混淆了术语。在这种情况下,我相信数组 A 是指在将它们预处理为-1和+ 1之前的原始值数组。这些值很好,因为具有为原始数组的每个块计算的最小值使得执行RMQ要快得多。稍后会详细介绍。现在,不要担心+1和-1值。他们以后会发挥作用。

  

如果A'只保留1s和-1s的记录,那么对它做任何事都没用。

这是真的。但是,这里A'保存每个块之前的最小值它们已经被预处理为-1和+1值,所以这实际上是一个有趣的问题需要解决。同样,-1和+1步骤尚未发挥作用。

  

要索引表P,预处理A中每个块的类型并将其存储在数组T [1,N / l]中。块类型是通过将-1替换为0而使用1替换+1而获得的二进制数。

这是-1和+1值的来源。这一步骤背后的关键思想是,对于小块大小,块中-1和+ 1的可能组合并不多。例如,如果块大小为3,则可能的块为

---
--+
-+-
-++
+--
+-+
++-
+++

在这里,我使用+和 - 来表示+1和-1。

您正在阅读的文章提供了以下技巧。而不是使用-1和+1,使用二进制0和1.这意味着可能的块是

000 = 0
001 = 1
010 = 2
011 = 3
100 = 4
101 = 5
110 = 6
111 = 7

这种方案的优点是双重的。首先,由于只有有限数量的块,因此可以为每个可能的块预先计算该块内任何索引对的RMQ答案。其次,由于每个块都可以解释为整数,因此可以将这些问题的答案存储在由整数键控的数组中,其中每个整数都是通过将块的-1和+1值转换为0和1来获得的。

希望这有帮助!