构建二进制搜索树和AVL树所需的时间复杂度之间的差异?

时间:2013-07-13 11:15:17

标签: algorithm data-structures binary-search-tree time-complexity avl-tree

当我学习二元搜索树(平衡和不平衡)时,我想出了我需要解决的问题:

  1. 如果构建二元搜索树(不需要平衡),使用n个元素,那么树构造的总时间复杂度是多少?

  2. 如果AVL树是由n个元素构成的,那么构建该AVL树的时间复杂度是多少?

  3. 是否应该超过nlog(n)?因为我们需要大量的旋转来进行AVL树构建。

    我知道AVL树中的插入和删除操作将是log(n)顺序(如果使用随机元素构造的二叉搜索树具有log(n)高度,则同样如此)。

    但我需要了解整体树构建成本及其变化方式,因为我需要使用平衡搜索树进行分类。

2 个答案:

答案 0 :(得分:16)

让我们从构建AVL tree开始。要创建树,您必须在其中插入n个元素。要在平衡树中插入元素,您需要log(n)。因此,您最终得到O(n*log(n))

回到常规BST。这是违反直觉的,但这取决于你如何构建这棵树。如果您事先不知道BST的所有元素(online algorithm),那么您必须逐个插入每个n元素。如果你非常不走运,插入的复杂性为O(n),因此它会恶化到O(n^2)

请注意,这种情况极不可能,但仍有可能。

但如果事先了解所有元素,您仍然可以实现O(nlog(n))您可以对它们进行排序O(nlog(n)),然后按以下顺序插入元素。 Take the middle element and insert it as a root,然后递归地对剩下的两个部分做同样的事情。您最终将使用n插入log(n)元素来创建平衡的BST。

答案 1 :(得分:7)

  1. 可以证明BST的预期高度满足E [Xn] <= 3 log n + O(1),因此预期时间是O(n log n)。最坏的情况仍然是O(n ^ 2),例如如果输入已排序。
  2. O(n log n)因为每个添加元素的旋转量是O(1)。