11

有一种叫做 treap 的数据结构:这是一个随机二叉搜索树,它也是随机生成的所谓“优先级”的堆。

这种结构有一个变体,其中键是隐式的,它们不存储在树中,但我们将树中节点的有序索引视为该节点的键。我们需要在每个节点中存储子树的大小而不是键。这种技术使我们能够将treap视为某种数组,它支持在O(log N)时间内进行大量操作:插入、删除、子数组的反转、间隔变化等等。

我对这个结构有点了解,但没有那么多。我试图用谷歌搜索它,但我发现只有很多关于trap本身的文章,但没有关于这个“隐式treap”/“索引列表”的文章。我什至不知道它的名字,因为我的母语不是英语,而且我听的讲座使用的是母语结构术语,而不是英文原词。这个原生术语可以直接用英文翻译为“隐式键上的Treap”或“隐式键上的笛卡尔树”。

谁能指出关于这个结构的文章或告诉我它的原名?谢谢你。

PS对不起,如果我的英语不够理解。

UPD:关于我正在寻找的结构的一些额外解释。

考虑一个具有随机选择的优先级和键的常见trap,它们是存储在树中的实际用户数据。然后让我们假设我们在每个节点中存储了一些其他用户信息,并且键只是搜索键。下一步是计算和维护每个节点中的子树大小:我们必须在每次 Merge/Split/Add/Remove 之后更新此参数,但它允许我们在 O(log N) 中找到树的第 K 个元素时间。

当我们在每个节点中都有子树大小时,我们可以扔掉键并想象 treap 表示按顺序遍历的用户数据数组。每个元素的数组索引可以很容易地从子树大小计算出来。现在我们可以在数组中间添加/删除一个元素或拆分这个数组——所有这些都在 O(log N) 时间内。

我们还可以进行“多重”操作——例如,为我们的“数组”的所有元素添加一个常量值。为了实现这一点,我们必须使这个操作延迟,在每个节点中添加一个参数,表示一个延迟常量,该常量必须“稍后”添加到该节点子数组的所有元素,并将更改“推”到下为必要的。向子数组添加一个常量或绘制(标记)子数组可以通过这种方式延迟,如反转子数组(这里节点中的延迟信息在位“子数组必须被反转”)等等。

UPD2:这是代码片段- 我发现的少量信息。不要注意西里尔字母 :) 单词“с неявным ключом”在直接翻译中的意思是“带有隐式键”。

4

4 回答 4

4

您可以在 Kaplan 和 Verbin 的论文中找到此数据结构,该论文关于通过反转对有符号排列进行排序(第 7 页,第 3.1 节): http: //www.math.jussieu.fr/~fouquet/ENSEIGNEMENT/PROJETS/kaplan.pdf

于 2012-12-03T11:00:03.420 回答
1

也许您正在寻找根据您的延迟操作需要修改的绳索(字符串的复杂形式)。有趣的是,现在这里有一个关于绳索的悬而未决的问题

于 2010-10-11T17:53:03.170 回答
1

treaps 中的关键思想(不是双关语!)是使用随机的密钥。如果您删除密钥,我看不出您如何进行欺骗:所以也许我误解了您的问题。或者,您可能指的是 treaps 的替代方案,即随机二叉搜索树。两种数据结构都使用相同的想法,即您可以通过确保您的树看起来像普通树(而不是病态案例)来获得平均案例复杂性。

使用陷阱,您可以使用随机优先级和平衡来做到这一点。

对于随机二叉树,随机性只包含在构建过​​程中:也就是说,当您在树 T 中插入一个节点时,它有 1/(size(T) + 1) 的概率位于根处,其中 size(T)是 T 的节点数;当然,如果节点没有插入到根节点,你会递归地继续直到它被添加。(有关这些树的详细研究,请参阅我的 C. Martinez 的文章。)

这种数据结构的行为与trap 完全一样,但使用了一种不需要密钥的不同机制。

如果这不是您要查找的内容,也许您可​​以分享一些额外的信息:您的讲师是否提到了可能曾在此结构上工作过的任何人,您在哪里,这位讲师以及他/您的国籍。看起来可能不像,但了解您的母语可能是一个重要线索,因为您通常可以将算法/数据结构与起源它的特定国家联系起来。

于 2010-08-16T23:09:08.637 回答
0

我认为该数据结构没有名称,因为它只是两个正交概念的组合。您可以将这样的隐式键与几乎任何自平衡树数据结构一起使用。

您可能想看看 Scapegoat 树,因为它们已经使用子树大小进行重新平衡,并且不需要任何每个节点的开销。

于 2010-08-19T16:19:52.843 回答