从 AVL 树中删除一系列元素的最有效方法是什么?
What would be the most efficient way to remove a range of elements from an AVL tree?
我有一个平衡的 AVL 树,它具有整数值和一个段 [L, R]。
我想删除具有此范围内值的所有节点并重新平衡树,以便其余节点形成平衡的 AVL 树。
这个操作的计算复杂度是多少?
在 AVL 树中拆分和加入是 O(log n),如果仔细的话。你的操作可以通过两次拆分和一次连接来完成,如果你想调用它们 finalizers/destructors,再加上销毁从 L 到 R 的所有值的成本。因此,总成本是 O(log n) 或 O(log n + k),具体取决于您是否调用析构函数。
对于 AVL 树,我不会复习 split/join,因为它主要只是一堆无聊的案例分析,就像插入和删除一样。 However, I did that elaboration a few years ago for red-black trees.
我有一个平衡的 AVL 树,它具有整数值和一个段 [L, R]。
我想删除具有此范围内值的所有节点并重新平衡树,以便其余节点形成平衡的 AVL 树。
这个操作的计算复杂度是多少?
在 AVL 树中拆分和加入是 O(log n),如果仔细的话。你的操作可以通过两次拆分和一次连接来完成,如果你想调用它们 finalizers/destructors,再加上销毁从 L 到 R 的所有值的成本。因此,总成本是 O(log n) 或 O(log n + k),具体取决于您是否调用析构函数。
对于 AVL 树,我不会复习 split/join,因为它主要只是一堆无聊的案例分析,就像插入和删除一样。 However, I did that elaboration a few years ago for red-black trees.