【发布时间】:2013-01-24 12:34:57
【问题描述】:
所以,我阅读了thisTopCoder 关于 RMQ(最小范围查询)的教程,我遇到了一个大问题。
在他介绍 approach的部分,我到现在能理解的是:
(整个方法实际上使用了Sparse Table (ST) Algorithm、Reduction from LCA to RMQ和from RMQ to LCA中介绍的方法)
给定一个数组 A[N],我们需要将其转换为笛卡尔树,从而使 RMQ 问题成为 LCA(最低公共祖先)问题。稍后,我们可以得到数组 A 的简化版本,并使其成为受限 RMQ 问题。
所以它基本上是两个转换。所以第一个 RMQ 到 LCA 部分很简单。通过使用堆栈,我们可以在 O(n) 时间内进行转换,得到一个数组 T[N],其中 T[i] 是元素 i 的父元素。树就完成了。
但这是我无法理解的。 O(n) 方法需要一个数组,其中|A[i] - A[i-1]| = 1,并且该数组在本教程的Reduction from LCA to RMQ 部分中介绍。这涉及到这棵树的欧拉之旅。但是,如何通过转换的最终结果来实现呢?我的方法不是线性的,所以在这种方法中应该被认为是不好的,线性方法是什么?
更新:让我感到困惑的一点
Here's the array A[]:
n : 0 1 2 3 4 5 6 7 8 9
A[n]: 2 4 3 1 6 7 8 9 1 7
Here's the array T[]:
n : 0 1 2 3 4 5 6 7 8 9
T[n]: 3 2 0 * 8 4 5 6 3 8 // * denotes -1, which is the root of the tree
//Above is from RMQ to LCA, it's from LCA to RMQ part that confuses me, more below.
树的图片:
Euler Tour 需要知道每个节点的子节点,就像 DFS(深度优先搜索)一样,而 T[n] 只有每个元素的根,而不是子节点。
【问题讨论】:
-
我不确定我是否理解您所说的“如何通过转换的最终结果实现这一点”。您能详细说明一下具体是什么让您感到困惑吗?
-
@templatetypedef 好的,我将它添加到问题中。
-
@templatetypedef 已添加。
-
你从哪里得到这个 T 数组?我没有在教程中看到任何描述,所以我不知道如何提供帮助。
-
@templatetypedef "从 RMQ 到 LCA"。该部分中有代码。
标签: algorithm tree least-common-ancestor rmq cartesian-tree