我使用自平衡二进制搜索树(目前它是一个AVL树,但可以用另一个替换)。 我注意到有一些不同的时期只执行某些操作:大型删除或插入批次很少执行,而大多数时候它是不可变的搜索树。 如果我推迟重新平衡到批次结束,是否会有任何性能提升?
答案 0 :(得分:1)
对于批量插入,将新项目插入单独的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)操作。
答案 1 :(得分:0)
说AVL树的渐近复杂度是O(log(N))。但真正的计算显然是在运行时决定的。
延迟重新平衡可以使其看起来很快,但存在风险。仅当树平衡时,插入的平均时间为O(logN)。如果批量插入使树高度倾斜,我们可能会获得O(N)插入时间。
无论如何,插入将采用O(logN),因此重新平衡不会产生太大影响,因为它也将是O(logN)。
要获得实际的好处,您需要考虑插入的批量大小,并在插入/删除期间搜索以及插入的键的值。