以下递归代码的复杂性

时间:2016-10-22 01:23:51

标签: algorithm recursion time-complexity binary-tree

试图弄清楚为什么复杂性为此代码的O(n):

int sum(Node node) {
    if (node == null) {
      return 0;
    }
    return sum(node.left) + node.value + sum(node.right);
}

节点是:

class Node {
  int value;
  Node left;
  Node right;
}

这是来自CCI的书。不应该是O(2 ^ n)因为它遍历每个节点吗?

然而这个是O(2 ^ n),这对我来说很清楚:

int f(int n) {
 if (n <= 1) {
  return 1;
}
 return f(n - 1) + f(n - 1);
}

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

  

如果算法的时间,则算法采用线性时间或O(n)时间   复杂度是O(n)。非正式地,这意味着足够大的输入   尺寸运行时间随输入的大小线性增加。   例如,添加列表的所有元素的过程需要   时间与名单的长度成正比。

From Wikipedia

算法复杂度为O(n)是非常合理的,因为调用的递归函数数量与树中的项目数成正比,树中有n个项目,我们只传递一个项目,这对我来说听起来很线性。

与其他与递归Fibonacci序列算法非常相似的算法相比,我们将这个算法从1到n传递多于一次的次数,并且与n不成线性比例,this解释为什么它有O(2 ^ n)复杂度。