完全平衡二叉树的复杂性

时间:2015-01-24 10:23:01

标签: binary-tree big-o complexity-theory

我的场景是一个包含整数的完美平衡二叉树。

我已经搜索过并找到了二叉树最佳/最差情况的许多解释。最好的情况是O(1)(在根目录中找到目标),最差的是O(log(n))(树的高度)。

我发现很少或没有关于计算平均复杂度的信息。我能找到的最佳答案是O(log(n)) - 1,但我想我并不完全理解(如果正确)这个平均情况的计算方法。

此外,搜索不在树中的整数会产生相同的复杂性,我认为会这样,但任何煽动都会受到赞赏。

1 个答案:

答案 0 :(得分:4)

假设我们有一个完美平衡的binaray树,其中包含n = 2k个整数,因此深度为log₂(n) = k

正如您所说,最好和最坏的情况是O(1)O(log(n))

简短方法

让我们从二叉树中选择一个随机整数X(均匀分布)。树的最后一行包含与第一个k-1行相同数量的整数。概率1/2 X位于第k-1行,因此我们最多需要O(k-1) = O(log(n)-1)步才能找到它。并且概率1/2 X位于最后一行,我们需要O(k) = O(log(n))步。

我们总得到

E[X] ≤ P(row of X ≤ k-1)⋅O(log(n)-1) + P(row of X = k)⋅O(log(n)) 
     = 1/2⋅O(log(n)-1) + 1/2⋅O(log(n))
     = 1/2⋅O(log(n)-1) + 1/2⋅O(log(n)-1)
     = O(log(n)-1)

注意:这有点难看,但在O-notation中O(x)O(x±c)对于任何常量值c都是相同的。

很长的路

现在让我们尝试计算树中随机(均匀分布)整数X包含的平均情况,并在i - th"行&#上命名整数集。 34;树TiTi包含2i个元素。 T0表示根。

在第i行中选择整数的概率为P(X ∈ Ti) = 2i/n = 2i-k

要在行i上查找整数,需要O(2i) = O(i)步。

所以预期的步骤数是

E[X] = Σi=0,...,k-1 O(i)⋅2i-k.

为了简化这一点,我们使用

O(i)⋅2i-k + O(i+1)⋅2i+1-k ≤ O(i)⋅2i+1-k + O(i+1)⋅2i+1-k ≤ O(i+1)⋅2i+2-k

这导致我们

E[X] = Σi=0,...,k-1 O(i)⋅2i-k ≤ O(k-1)⋅2⁰

k = log(n)以来,我们发现平均情况属于O(log(n)-1) = O(log(n))

不在树中的值

如果值不在树中,则必须遍历整个树。在log(n)步之后,你找到了一片叶子。如果该值等于您的输入值,则表示您已找到所用的值。如果没有,您知道,您搜索的值不在树中。因此,如果您搜索不在树中的值,则需要O(log(n))