【问题标题】:When converting to a red-black tree, is there any reason to choose one form over another?转换为红黑树时,是否有任何理由选择一种形式而不是另一种形式?
【发布时间】:2010-12-13 05:12:44
【问题描述】:

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

其中一种方法在O(n) 时间内从双链表转换为完美平衡的简单二叉树(假设项目数是预先知道的)。该算法被称为“折叠”——它是二叉树再平衡算法的后半部分,曾在 Dobbs 博士上发表过。步骤基本...

  • 给定树的大小,决定左右子树的大小

  • 左子树的递归

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

  • 右子树的递归

  • 将子树链接到根

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

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

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

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

这纯粹是出于好奇——我知道我没有任何实际的理由——但有谁知道这种选择很重要的专业应用程序吗?

【问题讨论】:

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


    【解决方案1】:

    短答案是:它取决于。

    基本上,任何有效的树都足够了。但是,在amortized analysis - 它可能很可能是您希望选择最正确的树,从长远来看会给您提供最优化的行为。

    例如如果您总是选择一个有效的树,但一个容易出现大量均衡操作的树,您将获得摊销较差的性能。一个明显的例子是一个完全黑树,它是完全有效的,但在修改时尚未执行错误。

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

    【讨论】:

    • 抱歉稍后删除接受,但我真的喜欢jbapple span>的新答案
    【解决方案2】:

    在使用物理学家的方法修改红黑树的摊销成本的标准分析中,具有零个或两个红色子节点的黑色节点被分配了一个正电位 1,这意味着它们代表树中存在额外问题的问题位置可能需要做一些工作。红色节点和正好有一个红色子节点的黑色节点的电位为零。

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


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

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

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

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

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

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

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

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

    在红黑树中,具有一个红色子节点的节点只是 2-4 树中 3 节点的表示。这些节点对子树中的插入或删除是特殊且稳健的,因此在构建会看到大量更新的红黑树时应优先使用它们。

    如果您知道您只会看到插入,请选择具有两个黑人孩子的节点。如果您知道您只会看到删除,请选择具有两个红色子节点的节点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-26
      • 1970-01-01
      • 2015-05-11
      • 2020-11-21
      • 1970-01-01
      • 1970-01-01
      • 2021-05-13
      相关资源
      最近更新 更多