使用隐式键进行Treap

时间:2010-08-16 22:18:57

标签: algorithm data-structures binary-tree key treap

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

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

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

有人能指出我关于这个结构的文章或告诉我它的原始名称吗?谢谢。

P.S。对不起,如果我的英语不够容易理解。

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

考虑使用随机选择的优先级和键的常规treap,它们是存储在树中的实际用户数据。然后让我们假设我们在每个节点中都存储了一些其他用户信息,而键只是搜索键。下一步是计算和维护每个节点中的子树大小:我们必须在每次合并/拆分/添加/删除后更新此参数,但它允许我们在O(log N)中查找树的第K个元素时间。

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

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

UPD2:这是code snippet - 我发现的一小部分信息。不要注意西里尔语:)单词“снеявнымключом”的意思是直接翻译“with implicit key”。

4 个答案:

答案 0 :(得分:4)

你可以在Kaplan和Verbin的论文中找到这种数据结构,通过逆转排序有符号的排列(第7页,第3.1节):http://www.math.jussieu.fr/~fouquet/ENSEIGNEMENT/PROJETS/kaplan.pdf

答案 1 :(得分:1)

treaps中的关键思想(没有双关语!)是使用随机化的密钥。如果你取下钥匙,我不知道你怎么能有一个接近:所以也许我误解了你的问题。或许你指的是替代treaps,随机二叉搜索树。两种数据结构使用相同的想法,即通过确保树看起来像普通树(而不是病态案例),可以获得平均案例复杂性。

使用treaps,您可以使用随机优先级和平衡来执行此操作。

使用随机二叉树,在构造过程中仅包含随机性:也就是说,当您在树T中插入节点时,它的概率为1 /(size(T)+ 1)位于根,其中大小(T)是T的节点数;当然,如果节点未插入根节点,则会继续递归,直到添加它为止。 (参见我的C. Martinez文章,详细研究这些树木。)

此数据结构的行为与treap完全相同,但使用不需要密钥的其他机制。

如果这不是你想要的,也许你可以分享一些额外的信息:你的讲师是否提到任何可能参与过这种结构的人,你在这里讲这个讲师的位置以及他/你的国籍。它可能看起来不像,但了解您的母语可能是一个重要的线索,因为您通常可以将算法/数据结构与发起它的特定国家挂钩。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

您可能希望查看替罪羊树,因为他们已经使用子树大小进行重新平衡,并且不需要任何每个节点的开销。