渐近时间复杂度、Big oh 和 Theta 分析。这是一个技巧问题吗?

Asymptotic time complexity, Big oh and Theta analysis. Is this a trick question though

问题如下:

考虑如下排序算法: I. 将给定输入A[1], A[2], ..., A[n]按给定顺序插入二叉搜索树T,从空开始树;二。对 T 进行中序遍历,以非降序输出元素。 (a) 该算法的最坏情况时间是多少? (b) 该算法的最佳案例时间是多少?

我的回答:

我在 t(n) = 2(n/2) + n 中创建了一个 BST,因为我们必须遍历每个单独的元素,然后我还在 t(n) = 2(n/2) + n 中按顺序打印出 BST,因为我们必须再次遍历每个元素。然后我将时间复杂度加在一起,以 t(n) = 4(n/2)+2n.

结尾

按照师父的方法,符合情况一,制作θ(n^2)。如果是 θ(n^2),这就回答了问题的 a 和 b。我看不出怎么会有更好的表现,或者在那种情况下表现更差。

这是一个技巧问题吗?

简答:

You added the RHS of the two equations but not the LHS – it should be 2T(n).

当然,T(n)的口头描述是"time complexity function",但是什么?在这种情况下,它的时间复杂度应该是 或者 BST 创建 或者 中序遍历,而不是两者一起。

所以最后的结果是2T(n) = 4T(n/2) + 2n。取消 2,得到 O(n log n).


tl;博士回答:

But wait, why n log n for traversal too? There are only n elements, right?

通过将问题分成相等的两半 T(n/2),您隐含地假设树在每次插入后都是 平衡的。对于简单的非自平衡 BST 树实现,情况并非总是如此。如果树的一侧是 "tilted",则插入可能与 O(n) 一样多(即 O(n^2) 构造)。

幸运的是,对于大多数常用的自平衡树类型,例如Red-Black 和 AVL,插入保证为 O(log n) 或以下。因此 正确 树构造的递归关系是 T(n) = T(n - 1) + log n,结果是 O(n log n)(斯特林方程)。

尽管如此,any BST 的遍历,无论是否平衡,都是 O(n),因为只有 n 个元素。这意味着您的遍历递归关系是错误的 - 它应该是 T(n) = 2T(n/2) + 1,因为每个节点只完成了 O(1) 工作。