表示插入二叉搜索树的时间效率,
我知道插入的最佳/平均情况是O(log n),最坏的情况是O(N)。
我想知道的是,除了实施AVL(平衡BST)之外,是否有任何方法可以确保我们在插入时始终具有最佳/平均情况?
谢谢!
答案 0 :(得分:0)
如果不平衡二叉搜索树,则无法保证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
。
最糟糕的情况是O(n)
,当您不平衡BST并且您的树退化为链接列表时,可能会发生这种情况。很明显,为了定位在列表的末尾(这是最坏的情况),你必须遍历整个列表,这需要n
步。