【发布时间】:2017-07-18 03:26:05
【问题描述】:
对于插入二叉搜索树的时间效率,
我知道插入的最佳/平均情况是 O(log n),而最坏情况是 O(N)。
我想知道的是,除了实施 AVL(平衡 BST)之外,是否有任何方法可以确保我们在插入时始终拥有最佳/平均情况?
谢谢!
【问题讨论】:
标签: insert time-complexity big-o binary-search-tree avl-tree
对于插入二叉搜索树的时间效率,
我知道插入的最佳/平均情况是 O(log n),而最坏情况是 O(N)。
我想知道的是,除了实施 AVL(平衡 BST)之外,是否有任何方法可以确保我们在插入时始终拥有最佳/平均情况?
谢谢!
【问题讨论】:
标签: insert time-complexity big-o binary-search-tree avl-tree
如果不平衡二叉搜索树,则无法保证 log n 复杂度。在搜索/插入/删除时,您必须在树中导航,以便将自己定位在正确的位置并执行操作。关键问题是——到达正确位置需要多少步?如果 BST 是平衡的,您可以预期平均 2^(i-1) 节点位于 i 级别。这进一步意味着,如果树有k 级别(k 称为树的高度),则树中的预期节点数为1 + 2 + 4 + .. + 2^(k-1) = 2^k - 1 = n,这给出k = log n,这就是从根导航到叶所需的平均步数。
话虽如此,平衡 BST 有多种实现方式。您提到了 AVL,另一个非常流行的是 red-black tree,它用于例如在 C++ 中实现 std::map 或在 Java 中实现 TreeMap。
当您不平衡 BST 并且您的树退化为链表时,可能会发生最坏的情况,O(n)。很明显,为了定位到列表的末尾(这是最坏的情况),您必须遍历整个列表,这需要n 步骤。
【讨论】: