程序的时间复杂性

时间:2017-06-13 18:14:59

标签: algorithm time-complexity asymptotic-complexity

考虑以下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)

我做错了什么?

2 个答案:

答案 0 :(得分:2)

重复发生等同于fibonacci numbers,维基百科上有很多关于此重复的信息。确实,斐波纳契在O(2 ^ n)和Omega(2 ^(n / 2))中。有related questions提到这个界限以及~θ(1.6n)的紧束缚。

答案 1 :(得分:0)

仅计算最后一级。 其他层只是调用下一层。