从红黑树中删除多个元素的算法

时间:2010-11-04 19:23:20

标签: c++ red-black-tree

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

5 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

如果没有约束表示在执行多节点删除时树必须保持平衡,那么我可以在执行多次删除后修复树。

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

答案 2 :(得分:1)

您可能对名为TeardownTree的数据结构感兴趣。它支持在delete_range时间内运行的O(k + log n)操作,其中n是树中的初始项目数,k是删除的项目数(并返回到呼叫者)。完全披露:我是作者。

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

答案 3 :(得分:0)

我解决这个问题的方法是创建一个要删除的节点的链表,并连续使用它们的标准删除方法。我很想知道是否有更好的大规模删除算法。

答案 4 :(得分:0)

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

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