加入两棵红黑树的最佳方式

时间:2017-04-29 15:43:02

标签: algorithm data-structures tree red-black-tree

最简单的方法是将两个树存储在两个数组中,合并它们并构建一个新的红黑树,其中排序的数组需要O(m + n)次。

是否存在时间复杂度较低的算法?

3 个答案:

答案 0 :(得分:2)

您可以在时间 O(m log(n / m + 1))中合并两棵红黑树,其中n和m是输入尺寸,WLOG,m≤n。请注意,此边界比O(m + n)更紧密。这是一些直觉:

  • 当两棵树的大小相似(m≈n)时,界限约为O(m)= O(n)= O(n + m)。
  • 当一棵树明显大于另一棵树(m << n)时,界限约为O(log n)。

您可以找到算法here的简要说明。可以在recent paper中找到更深入的描述,其中推广到其他平衡方案(AVL,BB [α],Treap,...)。

答案 1 :(得分:0)

由于您需要比较elementm n中的每个Red-Black Trees,因此您必须至少处理O(m+n)时间复杂度,有一种方法可以做到O(1)空间复杂性,但这是与你的qu无关的其他东西。如果您没有迭代并检查每个element中的每个Red-Black Tree,则无法保证您的新Red-Black Tree将被排序。我可以想到另一种合并两个Red-Black Trees的方法,它叫做“使用DLL的就地合并”,但是这个方法也会导致O(m+n)时间复杂度。

  1. 将给定的两个Red-Black Trees转换为Doubly Linked List,其时间复杂度为O(m+n)
  2. 合并两个排序Linked Lists,其时间复杂度为O(m+n)
  3. 从步骤2中创建的合并Red-Black Tree构建平衡list,其时间复杂度为O(m+n)
  4. 此方法的时间复杂度也是O(m+n)

    因此,由于您必须将每个Tree的元素与另一个Tree的其他元素进行比较,因此您必须至少得到O(m+n)

答案 2 :(得分:0)

我认为,如果您有一个通用的 Sets(如此通用的红黑树),您将无法选择@Sam Westrick 建议的解决方案。因为他假设第一个集合中的所有元素都小于第二个集合中的元素。也进了Cormen(学习算法和数据结构最好的书)指定了这个条件加入两个红黑树。