【发布时间】:2011-05-05 06:23:00
【问题描述】:
是否存在允许删除 RB 中的多个节点的算法,或者从 RB 中删除节点的唯一算法是以某种方式执行此操作:
1.删除一个
2. 必要时修复树
【问题讨论】:
标签: c++ red-black-tree
是否存在允许删除 RB 中的多个节点的算法,或者从 RB 中删除节点的唯一算法是以某种方式执行此操作:
1.删除一个
2. 必要时修复树
【问题讨论】:
标签: c++ red-black-tree
如果超过一半的节点被删除,您可以丢弃现有树并在更短的时间内构建新树,因为插入和删除的成本相同。
【讨论】:
如果在您执行多节点删除时没有规定树必须保持平衡,那么在我看来,您可以在执行多次删除后修复树,这似乎是合理的。
在每次删除后平衡树的目的是确保删除操作的计算成本是一致的。如果您不要求删除以这种方式保持一致,则可以以不同的方式编写删除算法。不过,修复操作将比仅删除一次后进行更长时间的计算。它也可能是一个更复杂的问题。
【讨论】:
您可能对名为TeardownTree 的数据结构感兴趣。它支持在O(k + log n) 时间工作的delete_range 操作,其中n 是树中的初始项数,k 是删除(并返回给调用者)的项数。全面披露:我是作者。
不得不强调的是,该数据结构不支持insert操作,而是针对clone和delete_range进行了优化。我写了一个非正式的description of the algorithm。通过所有优化,代码现在与该文档有很大不同,但应该足以掌握这个想法。
【讨论】:
我解决这个问题的方法是创建一个要删除的节点的链表,并依次对它们使用标准的删除方法。我很想知道是否有更好的批量删除算法。
【讨论】:
我建议使用 Treap 而不是红黑树,因为使用 Treap 与红黑树相比,在各种情况下平衡树似乎更容易。我和你有同样的问题,但是Treaps。 https://cstheory.stackexchange.com/questions/20495/algorithm-to-bulk-delete-nodes-from-a-treap
不确定预期的高度范围在批量删除后是否仍然有效(问题中提到的算法)。
【讨论】: