大约相同大小的类似treap的数据结构的更快连接


16

给定两个AVL树和以及值使得,很容易构造一个新的AVL树,其中包含和和T中的值在时间,其中表示树的高度(只要树木存储他们的高度)。Ť1个Ť2Ť[RXŤ1个ÿŤ2X<Ť[R<ÿŤ[RŤ1个Ť2Ø1个+|HŤ1个-HŤ2|HŤŤ

对于红黑树来说,这也是可能的,我还假设许多其他种类的平衡树。

这对于陷阱或类似陷阱的数据结构可能吗?如果我们忽略Ť[R怎么办?

Algorithmica的treaps论文显示了如何在ØHŤ1个HŤ2预期时间内执行此操作。如果有一种方法可以在大小(或根优先级)大致相同的挖矿(或类似挖矿的数据结构)上执行O(1)预期的联接,我认为可能可以使用Kaplan和Tarjan引导的技巧棘刺,以便使用双对数联接进行挖掘(或类似挖掘的数据结构)。


这是我写的一些Haskell代码,显示了具有大约相同大小的AVL树的快速连接:haskell.pastebin.com/nfGV8Ffz
jbapple 2011年

我怀疑这是可能的,因为它似乎(没有证明),新节点的预期深度(包含该值T_R)超过一常数甚至在的情况下,其中h(T_1)= H(T_2)。
伊藤刚(Tsuyoshi Ito)

伊藤刚:我同意,如果您以与为其他节点分配优先级相同的方式为新节点分配优先级。如果为它分配一个保证高于根节点的优先级怎么办?这破坏了优先级的IID性质,但是如果您随后以某种方式将其他优先级标记为已转移,又像持久性红黑树中的路径在端点处被标记,该怎么办?或者,如果仅将值存储在挖方的叶子中,并在没有t_r的情况下执行联接该怎么办?
jbapple 2011年

具有n个后代的挖掘节点中的i个左后代的概率为1 / n。即使对于相等大小的挖掘,这也可能会导致较长的合并时间-选择新的根需要导航至该根,由于树中的平均深度为Theta(lg n),因此也需要Theta(lg n)时间。如果具有n个后代的挖掘节点让i以概率(n选择i)/ 2 ^ n离开了子节点,而值仅存储在叶子(如B +树)中,该怎么办?然后,将两个相等大小的连接在一起,可以将少量元素从一棵树重新分配到另一棵树。
jbapple 2011年

如果我的计算正确,则重新分配的元素的预期数量为Theta(sqrt n),假设可以解决所有其他问题(例如,手指搜索属性),则预期仍会花费Theta(lg n)时间。使用更紧密的分布怎么办?
jbapple 2011年

Answers:


3

不,如果优先级是随机的,则不可能使用普通的Treap进行此操作。

我要提出的确切主张是,要对具有随机优先级的两个大小相等的挖方执行这种合并,需要更新期望中的指针。Θ日志ñ

这是一个粗略的证明草图:

考虑要执行该操作而必须更改的指针数。如果我们不插入而只是合并和,则证明约束更容易。考虑机身右侧的和机身左侧的。将的元素红色,将的元素蓝色。优先订购。每次颜色按此顺序更改时,我们都必须更改一个指针。由于两个棘的大小均为- [R Ť 1 Ť 2 小号1 Ť 1 小号2 Ť 2 小号1 小号2 小号1小号2 Θ 日志Ñ Θ 日志Ñ Θ 日志Ñ řΘ日志ñŤ[RŤ1个Ť2小号1个Ť1个小号2Ť2小号1个小号2小号1个小号2Θ日志ñ具有很高的概率,并且优先级是随机的,不难看出序列中颜色变化的数量也是。因此,我们需要为合并更新指针(不添加)。Θ日志ñΘ日志ñŤ[R

现在,在合并时添加并没有太大帮助。在这种情况下,指针更改的数量可以按如下方式限制下限:优先顺序为。删除序列中小于所有内容。然后,结果序列中颜色变化的次数是我们的下限。由于具有随机优先级,因此在最后的挖掘中以其为根的子树的预期高度为,因此它只有节点的优先级比预期的低,因此我们输了添加时,只有指针在我们的下限中改变。小号1小号2{ - [R } ř - [R Ô 1 ø 1 小号1小号2 Ô 1 řŤ[R小号1个小号2{Ť[R}Ť[RŤ[RØ1个Ø1个小号1个小号2Ø1个Ť[R

就是说,现在可能有一种获取“类似陷阱”的数据结构的方法,该结构允许进行恒定的预期时间合并。


是的,我正在寻找“类似陷阱”的数据结构。尽管我在评论中提到了很多,但我的答案还不存在,但我没有在标题或问题中加上它。
jbapple 2011年

感谢您的回答。我已经更改了问题的标题和文本,以减少歧义。
jbapple 2011年

1

更新:有关此联接操作不正确性的更新,请参见下文

这是一个可能的解决方案的粗略草图:

我认为我可以使用一种随机平衡的B +树来解决此问题。就像开挖一样,这些树具有独特的表现形式。与挖掘不同,它们多次存储一些密钥。可能有可能通过使用Bent等人的“偏爱的搜索树”中的技巧来解决,该技巧仅将每个关键字存储在它出现的最高(即最接近根)级别中。

通过首先将每个值与比特流相关联来创建用于有序唯一值集的树,类似于将treap中的每个值与优先级相关联的方式。树中的每个节点都包含密钥和位流。此外,非叶节点还包含一个自然数,该自然数指示以该节点为根的树的高度。内部节点可以具有任何非零数量的子代。像B +树一样,从根到叶的每个非自相交路径都具有相同的长度。

每个内部节点包含(如在B +-树中)其后代叶子的最大密钥。每一个还包含一个自然数,该自然数指示以为根的树的高度,以及从第个比特开始与关联的比特流。如果以为根的树中的每个键在其位流中都具有相同的第一位,则每个子代都是叶子,而为。否则,的子级是内部节点,所有内部节点在与它们的键关联的位流中都具有相同的第位。k i v k i + 1 v v i 1 v ivķ一世vķ一世+1个vv一世1个v一世

要从具有相关位流的键排序列表中创建树,请首先根据键流中的第一位将键收集到连续的组中。对于这些组中的每个组,使用该组中最大密钥的密钥和位流创建父对象,但忽略流的第一位。现在,对新父母执行相同的分组过程以创建祖父母。继续直到仅剩一个节点为止;这是树的根。

以下密钥和(开头)位流的列表由其下方的树表示。在位流前缀中,“。” 意味着一点。即,假设没有其他键的位流是不同的,则首先具有0的键A的任何位流都将产生与其他树相同的树。

A 0...
B 00..
C 10..
D 0...
E 0011
F 1...
G 110.
H 0001


        ____H____
       /         \
      E           H
      |          / \
    __E__       G   H
   /  |  \      |   |
  B   C   E     G   H
 / \  |  / \   / \  |
A   B C D   E F   G H

特定内部节点的每个子节点在其位流的第一位都具有相同的位。这称为父级的“颜色”-0是红色,1是绿色。这个孩子有一个“味道”,这取决于它的位流的第一位-0是樱桃,1是薄荷。叶子有味道,但没有颜色。根据定义,樱桃节点不能有绿色的父节点,而薄荷节点不能有红色的父节点。

假设比特流中的比特为均匀分布的IID,则节点的父节点数目的PMF 为 ,期望值为。对于所有,这都是,因此预期的树高为。2 1 n n 1ñ21个-ñ ñ-1个一世-1个ñ+1个/2ñ234ñØlgñ

要连接两棵等高的树,请首先检查其根是否具有相同的颜色。如果是这样,请从其最左边的子节点的左根断开,并从其最左边的子节点的右根断开,然后递归连接这两个树。结果将是一棵高度相同或更高的树,因为它们具有相同的风味(请参见下文)。如果递归连接两棵树的结果与两个被切断的子代的高度相同,则使其成为根的中间子代,剩余的左根子代在它的前面,而剩余的右根子代在它的后面。如果将其高1,则将其子节点设为根的中间子节点,将其左根的剩余子节点置于其前,将其右根的剩余子节点置于其后。如果根的颜色不同,请检查其味道是否相同。如果有的话 给他们一个新的父级,并带有右根的密钥和位流,以消除其第一位。如果不是,请给每个根节点一个新的父节点,并使用旧根节点的密钥和位流(将每个第一位都消除),然后递归地加入这些树。

此算法中有两个递归调用。第一种是当根的颜色相同时,第二种是当根的颜色和口味不同时。根具有相同的颜色,概率为。在这种情况下,递归调用总是看到具有相同味道的根,因此第二种递归永远不会在第一种之后发生。但是,第一个可以重复发生,但每次发生的概率为,因此预期运行时间仍为。第二个递归调用以概率发生,并且随后的递归调用始终在具有不同颜色的树上,因此适用相同的分析。1个/21个/2Ø1个1个/4

要连接两棵不等高的树,请首先沿着右树的左脊进行追踪,假设右树更高。(另一种情况是对称的。)当到达两棵等高的树时,对两棵等高的树执行联接操作,修改如下:如果结果具有相同的高度,则用结果替换子树加入。如果结果更高,则在通过添加根的父级使树高一个之后,将树的父级连接到另一棵树的根的右侧。树的高度等于,因此树的高度相同,因此终止于期望的。 1个/2Ø1个

更新:感谢QuickCheck,我发现上面的join方法不会产生与上面唯一表示的树相同的树。问题在于,叶子附近的父母选择可能会根据可用的同胞而改变。要解决这些更改,join必须一直遍历所有叶子,而不是。这是找到的示例QuickCheck:Ø1个

a 01110
b 110..
c 10...
d 00000

由制成的树的[a,b]高度为2,由制成的树的[c,d]高度为2,由制成的树的joinEqual (tree [a,b]) (tree [c,d])高度为3。但是,由制成的树的[a,b,c,d]高度为5。

这是我用来发现此错误的代码

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.