程序的时间复杂度
Time complexity of program
考虑以下 C 函数:
int f1(int n) {
if(n == 0 || n == 1)
return n;
else
return (2 * f1(n-1) + 3 * f1(n-2));
}
我必须找到 f1(n)
的 运行 时间
我的解决方案:-
f1(n)运行次的递推关系可以写成
T(n) = T(n-1) + T(n-2) + c
Where c is a constant
Also T(0) = T(1) = O(1) {Order of 1 (Constant Time)}
然后我用递归树的方法解决了这个递归关系
---
| n -------------------- cost = c
| / \
| n-1 n-2 ---------------- cost = 2c
| / \ / \
| n-2 n-3 n-3 n-4 ------------ cost = 4c
(n-1) levels | / \
| ......................
| ........................
| .........................\
| ..........................n-2k
| /
--- n-k
左子树一直到
n-k = 1 => k = n-1
所以渐近上界是
c+2c+2^2c+2^3c+....+2^(n-1)c
= Big-Oh(2^n)
同样右子树一直到
n-2k = 1 => k = (n-1)/2
所以渐近下界是
c+2c+2^2c+2^3c+....+2^((n-1)/2)c
= Big-Omega(2^(n/2))
由于函数的上限和下限不同
(而不是一个常数值)
Upper bound = 2^n = 2^(n/2) * 2^(n/2)
Lower bound = 2^(n/2)
所以在我看来我不能写T(n) = Theta(2^n)
但是这个问题的答案是
时间复杂度 = Theta(2^n)
我做错了什么?
递归等价于提到这个界限的fibonacci numbers, there is a lot information about this recurrence on wikipedia. It is true that fibonacci is in O(2^n) and in Omega(2^(n/2)). There are related questions以及~θ(1.6n)的紧密界限。
只计算最后一级。
其他层只是调用下一层。
考虑以下 C 函数:
int f1(int n) {
if(n == 0 || n == 1)
return n;
else
return (2 * f1(n-1) + 3 * f1(n-2));
}
我必须找到 f1(n)
的 运行 时间我的解决方案:-
f1(n)运行次的递推关系可以写成
T(n) = T(n-1) + T(n-2) + c
Where c is a constant
Also T(0) = T(1) = O(1) {Order of 1 (Constant Time)}
然后我用递归树的方法解决了这个递归关系
---
| n -------------------- cost = c
| / \
| n-1 n-2 ---------------- cost = 2c
| / \ / \
| n-2 n-3 n-3 n-4 ------------ cost = 4c
(n-1) levels | / \
| ......................
| ........................
| .........................\
| ..........................n-2k
| /
--- n-k
左子树一直到
n-k = 1 => k = n-1
所以渐近上界是
c+2c+2^2c+2^3c+....+2^(n-1)c
= Big-Oh(2^n)
同样右子树一直到
n-2k = 1 => k = (n-1)/2
所以渐近下界是
c+2c+2^2c+2^3c+....+2^((n-1)/2)c
= Big-Omega(2^(n/2))
由于函数的上限和下限不同 (而不是一个常数值)
Upper bound = 2^n = 2^(n/2) * 2^(n/2)
Lower bound = 2^(n/2)
所以在我看来我不能写T(n) = Theta(2^n)
但是这个问题的答案是 时间复杂度 = Theta(2^n)
我做错了什么?
递归等价于提到这个界限的fibonacci numbers, there is a lot information about this recurrence on wikipedia. It is true that fibonacci is in O(2^n) and in Omega(2^(n/2)). There are related questions以及~θ(1.6n)的紧密界限。
只计算最后一级。 其他层只是调用下一层。