转换为红黑树时,是否有理由选择一种形式而不是另一种形式?

时间:2009-11-04 22:09:00

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

我有一个链表/二进制树方法库,供标准容器不适用时使用 - 例如当有不同类型的节点,或者当我需要从二进制树转换为列表并再次返回时。它包括红黑树处理。

其中一种方法在O(n)时间内从双链表转换为完美平衡的简单二叉树(假设项的数量事先已知)。该算法被称为“折叠” - 它是二进制树重新平衡算法的后半部分,曾在Dr. Dobbs'中发布过。步骤基本上是......

  • 根据树的大小,决定左右子树的大小

  • 递归左子树

  • 从列表中弹出一个节点以用作根

  • 递归正确的子树

  • 将子树链接到根

我也有类似的方法来创建一个红黑树。原理是相同的,但递归跟踪节点高度 - 高度零节点被创建为红色,其他所有节点都是黑色。起始高度计算基于树大小中的最高设置位,并且被设置为使得完美平衡的(2^n)-1大小的树仅具有黑色节点(递归仅下降到高度1)。

这里的要点是我在叶级别只有红色节点,最多只有一半的节点是红色的。

问题是,虽然这是生成有效的红黑树的简单方法,但它不是唯一的选择。避免在完美平衡的树中将所有叶子染成红色是一种随意的选择。我可以有交替的红色和黑色节点层。或者我可以通过发现完全平衡的子树(如果它需要红色节点)使子树根变为红色而不是所有叶子来显着减少红色节点的数量。

问题是 - 是否有任何实际理由选择一种有效的红黑树形式?

这是纯粹的好奇心 - 我知道我没有任何实际的理由 - 但有没有人知道这个选择很重要的专家申请?

2 个答案:

答案 0 :(得分:2)

简短的回答是:取决于

基本上,任何有效的树都足够了。但是,就amortized analysis而言,很可能您需要选择最正确的树,从长远来看,它将为您提供最优化的行为。

e.g。如果你总是选择一个有效的树,但是那个容易进行大量平衡操作的树,你将获得不良的摊销性能。一个明显的例子是全黑树,它完全有效,但在修改时表现不佳。

这取决于,因为这通常是特定于应用程序的。

答案 1 :(得分:1)

在使用pysicist方法修改红黑树的摊销成本的标准分析中,具有零或两个红孩子的黑色节点被赋予一个正的潜力,这意味着它们代表树中有问题的地方可能需要完成工作。红色节点和只有一个红色子节点的黑色节点被赋予零电位。

因此,为了降低修改成本,给每个黑色节点一个红色孩子。

原因 为什么有一个红色孩子的黑色节点被祝福的原因最好通过类比冗余二进制数来解释。我将首先解释如何将红黑树与二进制数相关联,然后我将解释为什么一个红子节点是有用的。

如您所知,红黑树是表示2-4棵树的一种方式,其中从根到叶子的每条简单路径具有相同的长度,但节点有2,3或4个子节点。用于在2-4树中添加或删除节点的最简单算法与在冗余二进制数中添加或减去一个算法的算法相同。

冗余二进制数是第i位代表2 i 的数字,与标准二进制数一样,但第i位可以是0,1, 或2 。它们被称为冗余,因为有多种方法可以写入给定的数字。 4 dec 可以写成100或20或12。

要将一个添加到冗余二进制数,请递增最低有效数字;如果为3,则将其设置为1并递增下一个最低有效数字,依此类推。算法在遇到0或1时停止。

要将树叶添加到2-4树,请将子项添加到其预期父级。如果父母如何有五个孩子,将其分成两个节点并使其成为其父节点的子节点。继续,直到到达不需要拆分的节点。因此,当遇到具有两个或三个子节点的节点时,朝向根的路径会停止。

要限制递增冗余二进制数的分摊成本,请使用物理学家方法并为每2位数指定1的电位。接触k个数字的xall递增释放k-1个潜力,给它一个摊销成本O(1)。

该分析类似于递增标准二进制数的摊余成本,但标准二进制数不能同时支持O(1)摊销时间的增量和减量:考虑2 k - 1。它是k 1位数。增量成本Θ(k)。如果之后是递减,则该对成本为Θ(k)并将该数字带回其旧状态。

冗余二进制特殊之处在于1位数字会停止递增和递减的级联操作。 2-4个树是特殊的,3个节点停止插入和删除的级联操作。

在红黑树中,具有一个红色子节点的节点仅表示2-4树中的3节点。这些节点对于子树中的插入或删除是特殊且强大的,因此在构建会看到大量更新的红黑树时,您应该支持它们。

如果您知道只会看到插入,请使用包含两个黑孩子的节点。如果您知道只会删除,请使用包含两个红孩子的节点。