是否存在允许删除RB中的多个节点的算法,或者从RB中删除节点的唯一算法是以某种方式执行此操作:
1.删除一个和
2.如有必要,修复树
答案 0 :(得分:2)
如果超过一半的节点被删除,您可以丢弃现有的树并在更短的时间内构建一个新的树,因为插入和删除的成本相同。
答案 1 :(得分:1)
如果没有约束表示在执行多节点删除时树必须保持平衡,那么我可以在执行多次删除后修复树。
每次删除后平衡树的目的是确保删除操作的计算成本一致。如果不要求删除以这种方式保持一致,则可以用不同的方式编写删除算法。然而,修复操作将比仅在一次删除之后进行更长时间的计算。它也可能是一个更复杂的。
答案 2 :(得分:1)
您可能对名为TeardownTree的数据结构感兴趣。它支持在delete_range
时间内运行的O(k + log n)
操作,其中n
是树中的初始项目数,k
是删除的项目数(并返回到呼叫者)。完全披露:我是作者。
我必须强调数据结构不支持insert
操作,但针对clone
和delete_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
我不确定批量删除后的预期高度范围是否仍然有效(问题中提到的算法)。