平衡树的批量操作

Batch operations with balancing trees

我用的是自平衡二叉搜索树(目前是AVL树,但可以用其他树代替)。 我注意到在不同的时期只执行某些操作:很少执行大型删除或插入批处理,而大多数时候它是不可变的搜索树。 如果我将重新平衡推迟到批次末尾,会有任何性能提升吗?

比如说AVL树的渐近复杂度是O(log(N))。但真正的计算显然是在运行时决定的。

延迟再平衡可以让它看起来很快,但也存在风险。仅当树平衡时,插入的平均时间才为 O(logN)。如果批量插入使树高度倾斜,我们可能会得到 O(N) 插入时间。

无论如何,插入将花费 O(logN),因此重新平衡不会产生太大影响,因为它也将是 O(logN)。

要获得实际收益,您需要考虑插入的批量大小,并在 insertion/deletion 和插入的键的值期间进行搜索。

对于批量插入,将新项插入到单独的 AVL 树中,然后按照 http://www.geeksforgeeks.org/merge-two-balanced-binary-search-trees/ 中所述合并两棵树。合并树是一个 O(m+n) 操作,其中 m 和 n 是两棵树的大小。当新项目的数量与现有树中的项目数量相比较少时,这种方法应该更快。

对于批量删除,将 AVL 树中的项目标记为已删除。然后,对树进行中序遍历,从未删除的节点构建新的 AVL 树。有关示例,请参见 http://www.geeksforgeeks.org/sorted-array-to-balanced-bst/。从排序的节点列表构建新树是 O(n) 操作。