自定义树的复杂性顺序

时间:2015-11-29 08:54:33

标签: c algorithm data-structures generic-programming

请告诉我下面树的复杂性。 请解释计算过程。

树形结构:

Below is the tree structure

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>

上述算法的复杂程度如何?

2 个答案:

答案 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所解释的那样)