试图弄清楚为什么复杂性为此代码的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);
}
感谢您的帮助。
答案 0 :(得分:0)
如果算法的时间,则算法采用线性时间或O(n)时间 复杂度是O(n)。非正式地,这意味着足够大的输入 尺寸运行时间随输入的大小线性增加。 例如,添加列表的所有元素的过程需要 时间与名单的长度成正比。
算法复杂度为O(n)是非常合理的,因为调用的递归函数数量与树中的项目数成正比,树中有n个项目,我们只传递一个项目,这对我来说听起来很线性。
与其他与递归Fibonacci序列算法非常相似的算法相比,我们将这个算法从1到n传递多于一次的次数,并且与n不成线性比例,this解释为什么它有O(2 ^ n)复杂度。