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

Algorithm 重建二叉搜索树/四叉树/八叉树的时间复杂度?,algorithm,binary-search-tree,Algorithm,Binary Search Tree,假设我有一个有N个节点的二叉搜索树。或者四叉树,或者八叉树,如果它们有任何区别的话 然后让我们假设我运行一个算法来更改树中的所有键。移动东西似乎很复杂。也许有一个很好的算法可以实现这一点,但假设我采用简单的方法:迭代树,将键存储在列表中,然后通过重复的重新插入从头开始重建树。也就是说,完全重建 这种重建的时间复杂度是多少?有N个节点,每次插入都需要logn时间,但我无法理解树增长时会发生什么。假设您使用的是自平衡树,那么您已经回答了自己的问题,“有N个节点,每次插入都需要logn时间。”树是自平

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

然后让我们假设我运行一个算法来更改树中的所有键。移动东西似乎很复杂。也许有一个很好的算法可以实现这一点,但假设我采用简单的方法:迭代树,将键存储在列表中,然后通过重复的重新插入从头开始重建树。也就是说,完全重建


这种重建的时间复杂度是多少?有
N
个节点,每次插入都需要
logn
时间,但我无法理解树增长时会发生什么。

假设您使用的是自平衡树,那么您已经回答了自己的问题,“有N个节点,每次插入都需要logn时间。”树是自平衡的,这一点很重要,因为它允许您声明每次插入都需要logn时间。对于非平衡树,插入时间在最坏情况下可能是线性的。

由于插入(平衡)BST需要
Θ(logn)
,并且树从
0
节点开始,然后是
1
节点,然后是
2
节点,等等,我们得到的运行时间为:

Θ(log 1 + log 2 + ... + log n)
从这里,我们可以直接说运行时间是
Θ(n log n)
因为:()


是的,一个二进制搜索树,就像我在上面写的(只是不想一直这么说…也许我应该用typedef…哈哈哈)
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)
Θ(1 + 2 + ... + n) = Θ(n(n+1)/2) = Θ(n²)