假设我有一个包含N个节点的二叉搜索树。或者四叉树或八叉树,如果它们有任何区别。
然后让我说我运行一个算法来改变树中的所有键。移动东西似乎很复杂。也许实际上有一个很好的算法,但是让我说我采取简单的路线:我迭代树,将密钥存储在一个列表中,并通过重复重新插入从头开始重建树。也就是说,完全重建。
进行这种重建可以达到什么时间复杂度?有N
个节点,每次插入需要log N
次,但我无法理解树木生长时会发生什么。
答案 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时间的语句的原因。对于不平衡树,插入时间可能是线性最坏情况。