【问题标题】:Range Minimum Query <O(n), O(1)> approach (Last steps)Range Minimum Query <O(n), O(1)> 方法(最后一步)
【发布时间】:2013-01-24 22:21:02
【问题描述】:

接上一个问题“Range Minimum Query approach (from tree to restricted RMQ)”(推荐阅读)

再次,来自 TopCoder 上的this tutorial,我在这里和那里有几个问题,希望有人能解决它们。

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

不管怎样,我可以通过欧拉图得到那个数组,这是所有计算的核心部分。

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

第二步其实就是分区,这很简单,但是第三步让我很困惑。

令 A'[i] 为 A 中第 i 个块的最小值,B[i] 为 这个最小值在 A 中的位置。

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

第四步,

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

如果 A' 只保留 1 和 -1 的记录,那么在上面做任何事情似乎都没用。

最后一步,

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

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

这看起来像是多个问题,但我希望有人可以指导我完成最后这些步骤。谢谢!

【问题讨论】:

    标签: algorithm rmq


    【解决方案1】:

    希望这有助于解释事情。

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

    我认为作者在这里混淆了术语。在这种情况下,我相信数组 A 是指原始值数组,然后再将它们预处理为 -1 和 +1。这些值最好放在周围,因为为原始数组的每个块计算最小值使得执行 RMQ 更快。稍后再谈。现在,不要担心 +1 和 -1 值。它们稍后会发挥作用。

    如果 A' 只保留 1 和 -1 的记录,那么在上面做任何事情似乎都没用。

    确实如此。然而,这里 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 得到的。

    希望这会有所帮助!

    【讨论】:

    • 一个快速的问题,如何快速获得 A 中的最小值?有老式线性比较的东西,够好吗?
    • @ShaneHsu- 是的,没关系。所有块的总大小为 O(n),因此无需担心。
    • 几乎马上,我有疑问,如果你想看看,[rmq] 中有一个问题。
    • "因此,对于每个大小为 l 的二进制块,我们需要在表 P 中锁定每对索引之间的 RMQ 值。这可以在 O(sqrt(N)* l2)=O(N) 时空" 怎么样?
    • @ShaneHsu- 如果你能解决 RMinQ,你总是可以通过否定所有值来解决 RMaxQ,然后在新数组上解决 RMinQ。
    猜你喜欢
    • 2013-01-24
    • 2013-01-24
    • 2019-07-30
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多