BST遍历分解复杂度
break-down complexity of BST traversal
我在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
用于打印语句。但这似乎并不正确。
只是展开递归关系:
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)
.
来解决
递归关系应该是
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).
我在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
用于打印语句。但这似乎并不正确。
只是展开递归关系:
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)
.
递归关系应该是
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).