重建二叉搜索树/四叉树/八叉树的时间复杂度?

时间:2014-05-07 22:58:13

标签: algorithm binary-search-tree

假设我有一个包含N个节点的二叉搜索树。或者四叉树或八叉树,如果它们有任何区别。

然后让我说我运行一个算法来改变树中的所有键。移动东西似乎很复杂。也许实际上有一个很好的算法,但是让我说我​​采取简单的路线:我迭代树,将密钥存储在一个列表中,并通过重复重新插入从头开始重建树。也就是说,完全重建。

进行这种重建可以达到什么时间复杂度?有N个节点,每次插入需要log N次,但我无法理解树木生长时会发生什么。

2 个答案:

答案 0 :(得分:3)

由于插入(平衡)BST需要Θ(log n),树开始于0个节点,然后是1节点,然后是2等,我们得到一个运行时间:

Θ(log 1 + log 2 + ... + log n)

从这里开始,我们可以直接说出运行时间为Θ(n log n),因为:(related post

log 1 + log 2 + ... + log n <= log n + log n + ... + log n
                             = n log n

log 1 + ... + log n/2 + ... + log n >= log n/2 + ... + log n
                                    >= log n/2 + ... + log n/2
                                     = n/2 log (n/2)

这也与tree sort有关。


我们实际上可以证明我们不能比Θ(n log n)

更快地做到这一点

It's been proven要求平均至少Θ(n log n)次排序(使用基于比较的算法)。

由于我们可以在Θ(n)中迭代BST,因此我们可以直接推断出我们至少需要Θ(n log n)次插入。


注意 - 对于非平衡BST,运行时间实际上为Θ(n²),因为不平衡BST的最坏情况插入时间为Θ(n),因此我们有:

Θ(1 + 2 + ... + n) = Θ(n(n+1)/2) = Θ(n²)

答案 1 :(得分:0)

假设您使用的是自平衡树,那么您已经回答了自己的问题,“有N个节点,每个插入需要N次。”重要的是树是自平衡的,因为这是允许您做出每个插入花费log N时间的语句的原因。对于不平衡树,插入时间可能是线性最坏情况。