如何找到递归算法的时间复杂度?

时间:2016-05-25 14:47:31

标签: algorithm time-complexity

如何找到以下算法的复杂性:

   @app.route("/goo")
       //do something

正确的递归方程int f(int n) { if(n<=1) { return 1; } return f(n-1) + f(n-1); } 是否正确?怎么解决?

1 个答案:

答案 0 :(得分:1)

我认为你的递归方程是正确的。

但是这个具体案例很容易,只需要思考&#34;关于它有点不进一步进入&#34;如何解决一般的递归&#34;。

让我们来看看f(3)

            f(3)           

     f(2)    +    f(2)         

 f(1) + f(1) + f(1) + f(1)  

那么,我们有多少次电话? 1 + 2 + 4

嗯...... f(4)怎么样?

                           f(4)

             f(3)           +            f(3)

     f(2)    +    f(2)      +     f(2)     +   f(2)

 f(1) + f(1) + f(1) + f(1)  +  f(1) + f(1) + f(1) + f(1)

那么,我们有多少次电话? 1 + 2 + 4 + 8

所以我们可以对n = 5:1 + 2 + 4 + 8 + 16进行有根据的猜测。如果你考虑一下,它也有意义,因为:numCalls(f(5))= 2 * numCalls(f(4))+ 1(+ 1源于对f(5)本身的调用)。

我们可以概括为

T(n) = sum(2^i) for i in (0, n-1)

现在,如果我们使用

这一事实
sum(2^i) for i in (0, n-1) == 2^n - 1

很明显

T(n) = 2^n - 1 

位于O(2^n)

离开练习:

通过归纳证明

T(n) = 2*T(n-1) + 1   <=>  T(n)  = 2^n - 1

或者更一般:

T(n) = 2*T(n-1) + c   <=>  T(n)  = c*(2^n - 1)

正如评论中建议的旁注:您可以使用memoization

大幅改善效果