【问题标题】:Algorithm for removing multiple elements from a Red-Black tree从红黑树中删除多个元素的算法
【发布时间】:2011-05-05 06:23:00
【问题描述】:

是否存在允许删除 RB 中的多个节点的算法,或者从 RB 中删除节点的唯一算法是以某种方式执行此操作:
1.删​​除一个
2. 必要时修复树

【问题讨论】:

    标签: c++ red-black-tree


    【解决方案1】:

    如果超过一半的节点被删除,您可以丢弃现有树并在更短的时间内构建新树,因为插入和删除的成本相同。

    【讨论】:

      【解决方案2】:

      如果在您执行多节点删除时没有规定树必须保持平衡,那么在我看来,您可以在执行多次删除后修复树,这似乎是合理的。

      在每次删除后平衡树的目的是确保删除操作的计算成本是一致的。如果您不要求删除以这种方式保持一致,则可以以不同的方式编写删除算法。不过,修复操作将比仅删除一次后进行更长时间的计算。它也可能是一个更复杂的问题。

      【讨论】:

      • 抱歉,这没有意义。如果您在不修复树的情况下从树中删除节点,则会留下指向左右分支的悬空指针。
      • 我认为Phillis的意思是在节点删除后指针将被连接,但直到整个要删除的节点LL被删除后才会重新平衡。
      • 无论如何,我认为这可能是一个不好的方法 - 在多次删除后重新平衡树的复杂性可能远高于单个删除的总和。不过,我已经有一段时间没有使用这些了。
      • @reuscam:这取决于数字......重新平衡树的成本并不比 O(n) 差,其中 n 是剩余元素的数量,因为在最坏的情况下你可以只需从头开始重建树,元素已经排序。每一步的重新平衡需要时间 O(dlog(N)),其中 d 是删除的数量,N 是树中元素的原始数量。因此,如果要删除大量元素,则 dlog(N)*K 可能比 n*k 大得多(其中 k 和 K 是所涉及的常数因子),这可能会使重建变得值得。
      • reuscam,我的评论的意图是正确的。我也不一定建议这样做——树再平衡并不是一个简单的问题。我不想尝试解析树以重新平衡多个节点。
      【解决方案3】:

      您可能对名为TeardownTree 的数据结构感兴趣。它支持在O(k + log n) 时间工作的delete_range 操作,其中n 是树中的初始项数,k 是删除(并返回给调用者)的项数。全面披露:我是作者。

      不得不强调的是,该数据结构不支持insert操作,而是针对clonedelete_range进行了优化。我写了一个非正式的description of the algorithm。通过所有优化,代码现在与该文档有很大不同,但应该足以掌握这个想法。

      【讨论】:

        【解决方案4】:

        我解决这个问题的方法是创建一个要删除的节点的链表,并依次对它们使用标准的删除方法。我很想知道是否有更好的批量删除算法。

        【讨论】:

          【解决方案5】:

          我建议使用 Treap 而不是红黑树,因为使用 Treap 与红黑树相比,在各种情况下平衡树似乎更容易。我和你有同样的问题,但是Treaps。 https://cstheory.stackexchange.com/questions/20495/algorithm-to-bulk-delete-nodes-from-a-treap

          不确定预期的高度范围在批量删除后是否仍然有效(问题中提到的算法)。

          【讨论】:

            猜你喜欢
            • 2021-10-17
            • 2011-03-27
            • 2012-12-16
            • 2011-08-23
            • 2014-07-05
            • 1970-01-01
            • 2016-08-03
            • 2021-01-03
            相关资源
            最近更新 更多