【问题标题】:How to save the memory when storing color information in Red-Black Trees?在 Red-Black Trees 中存储颜色信息时如何节省内存?
【发布时间】:2013-04-11 21:17:44
【问题描述】:

我在 Coursera 算法课程之一中遇到了这个问题,并意识到我不知道该怎么做。但是,我仍然对此有一些想法。我首先想到的是使用优化的位集(如 Java 的BitSet)来获取映射节点的key -> color。因此,我们只需要为整棵树分配一个比特集并将其用作颜色信息源。如果树中没有重复的元素 - 它应该可以工作。

很高兴看到其他人对此任务的想法。

【问题讨论】:

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


    【解决方案1】:

    只需修改 BST。对于黑色节点,什么都不做。而对于红色节点,交换它的左孩子和右孩子。在这种情况下,一个节点可以根据其右孩子是否大于其左孩子来调整为红色或黑色。

    【讨论】:

    • 这不适用于没有两个子节点的节点。
    • 确实如此:只需检查一个节点是否在错误的位置。如果节点为零,则无需检查,因为我们从不给空节点一个红色链接。
    • 如果“空节点”表示没有任何子节点的节点,则“空节点”可能是红色的。只需检查红黑树维基百科条目upload.wikimedia.org/wikipedia/commons/thumb/6/66/...中的示例。鉴于此,在我看来,提议的方案将无法区分红色“空节点”和黑色“空节点”
    • 这听起来比公认的答案要糟糕得多——你必须检查两倍的链接!
    【解决方案2】:

    我们可以使用 2 条规则:

    1. 既然根节点总是黑色的,那么红色的节点总会有一个父节点。

    2. RB BST 的顺序总是 left_child

    然后我们会这样做:

    1. 保持黑色节点不变。

    2. 对于红色节点,我们称它为R,我们假设它是它的父节点的左子节点,称为P。

    将红色节点值从R更改为R',而R' = P + P - R

    现在R' > P,但由于它是左子树,我们会发现顺序不匹配。

    如果我们发现订单不匹配,那么我们就会知道它是一个红色节点。 而且很容易回到原来的R = P + P - R'

    【讨论】:

      【解决方案3】:

      我们可以将红色节点定义为将孩子放在错误位置的节点,而不是对孩子使用布尔属性。

      如果我们这样做,所有叶子节点都保证是黑色的,我们应该在插入新节点时将父节点与他的兄弟节点交换(使他成为红色)。

      【讨论】:

        【解决方案4】:

        使用节点中一个指针的最低有效位来存储颜色信息。在大多数平台上,节点指针应该包含偶数地址。详情见here

        【讨论】:

        • 你说得对,这是最常见的方法。但是,在 Java 中,这是不可能的,因为 Java 不公开其指针的位。 OP 可能正在使用 Java,但我不确定是否是这种情况。
        • @templatetypedef 这个问题没有明确针对Java,只是提到了一个类似于Java的数据结构,所以可能是这样,也可能不是。
        • 对,我不是说 Java 作为目标,但我期待可移植的解决方案(没有这个裸机细节)。无论如何,我什至无法理解这个答案。 @AlexeyFrunze,您能否更详细地解释一下这个想法(例如在 C 和 4 字节指针中)?
        【解决方案5】:

        一种选择是使用需要较少簿记的树,例如splay tree。但是,展开树尤其不适合迭代(它们在随机查找方面要好得多),因此它们可能不适合您正在工作的领域。

        您还可以根据节点位置为整个红黑树使用一个 BitSet,例如根是第 0 位,根的左分支是第 1 位,右分支是第 2 位,左分支的左分支是第 3 位,依此类推;这样,是否存在重复元素无关紧要。在遍历树时,记下您所处的位位置。

        就空间而言,为树使用一个位集而不是为每个节点分配一个布尔值会更有效;每个布尔值将占用至少一个字节,并且可能会占用一个字,具体取决于对齐方式,而位集将仅占用每个节点的一位(加上 2x 位以说明最短分支为一半长度的最大不平衡树)最长的分支)。

        【讨论】:

          猜你喜欢
          • 2015-02-23
          • 2013-05-12
          • 1970-01-01
          • 2021-12-04
          • 2011-06-25
          • 2019-02-12
          • 1970-01-01
          • 1970-01-01
          • 2020-07-04
          相关资源
          最近更新 更多