【问题标题】:break-down complexity of BST traversalBST遍历的分解复杂度
【发布时间】:2015-03-24 13:49:24
【问题描述】:
我在Python中有如下BST遍历函数:
def print_tree(tree):
if tree == None:
return
else:
print tree.value
print_tree(tree.left)
print_tree(tree.right)
最坏情况下的时间复杂度是O(n),但我很难证明这一点。我正在尝试使用常量 c 来分解它,这就是我所拥有的:
T(n) = 2T(n-1) + cn
T(n) 用于递归调用,cn 用于打印语句。但这似乎并不正确。
【问题讨论】:
标签:
python
recursion
big-o
time-complexity
【解决方案1】:
只是展开递归关系:
T(1) = c*n
T(2) = 3*c*n
T(3) = 7*c*n
T(4) = 15*c*n
...
如您所见,您永远不会在n 中获得非线性术语。
直观地说,复杂性是线性的,因为您在每个节点上做的工作量是恒定的,并且从不多次访问一个节点。
如果树是平衡的,递归关系就变成了
T(n) = 2T(n/2) + cn
并且可以使用master theorem(案例1)来解决给O(n)。
【解决方案2】:
递归关系应该是
T(n) = 2T(n/2) + cn
然后从这个answer
你可以解决你的递归关系。假设 cn = Θ(1)
T(n)=2T(n/2)+Θ(1)
=2T(n/2)+k
=2{2T(n/4)+k)+k
=4T(n/4)+3k
=...
=n.T(1)+(n-1)k
=n.k+(n-1)k
=2nk-k
=O(n).