请告诉我下面树的复杂性。 请解释计算过程。
树形结构:
root-> left-> right和root-> right-> left指向同一个节点。
算法:如果我们遍历正常的inorder遍历树,那么我们将访问一些节点超过1次。
像
node4(2次)0-> 1-> 4和0-> 2-> 4
节点7(3次)0-> 1-> 3-> 7,0-> 1-> 4-> 7-> 2-> 4-> 7 < / p>
上述算法的复杂程度如何?
答案 0 :(得分:2)
在图表结构(有向无环图或“DAG”,而不是树)中,遍历将访问除叶节点之外的每个节点的两个子节点。因此,它将访问总共2个 h -1个节点(计数重复),其中h是DAG的高度。 (图中的高度为5。)
假设DAG已完全填充,则n(DAG中的节点数)必须为h(h + 1)/ 2。 (这是高斯公式,用于求和从1到h的整数。)
Solving n = h(h+1)/2 for h gives us h = (sqrt(8n + 1) - 1)/2,所以访问的节点总数(以n为单位)为2 (sqrt(8n + 1) - 1)/ 2 - 1。
遍历功能如下所示:
def traverse(node):
if node.left is not None:
traverse(node.left)
print(node.data)
if node.right is not None:
traverse(node.right)
请注意,traverse
并未查看节点的父节点,仅查看其子节点。从traverse
的角度来看,一些节点是共享的(因此有两个父节点)是无关紧要的。它无法区分您的DAG和普通二叉树之间的区别。
您DAG的每个内部节点都有两个孩子。因此,从traverse
的角度来看,您的DAG与高度为h的完全填充的二叉树相同。高度为h的完全填充的二叉树具有2个 h -1个节点。
答案 1 :(得分:0)
如果我们逐级检查一个级别越过次数,那么我们将达到低于输出
等级1 - 1次
2级 - 2次
3级 - 4次
4级 - 8次
等级5 - 14次
高达
等级h
总遍历为:1 + 2 + 4 + 8 + 14 + ......高达h水平
将系列分为2个系列:
(1 + 0)+(2 + 0)+(3 + 1)+(4 + 4)+(5 + 9)+ ... h + sqOf(h-2)
装置
1 + 2 + 3 + 4 + ... + h
+
sqOf(1)+ sqOf(2)+ sqOf(3)+ ... + sqOf(h-2)
=&gt; h(h + 1)/ 2 +(h-2)(h-1)(2h-3)/ 6
所以复杂度的顺序变成了cubeOf(h),其中h是(sqrt(8n + 1) - 1)/ 2(正如rob offoff所解释的那样)