以下代码的大运行时分析

时间:2016-03-10 14:09:39

标签: algorithm big-o

public static long A (int N) {
  if (N <= 1) 
    return 1;

  return N + A(N-1) + A(N-2);
}

这是我的方法:堆栈将有N-1 + N-2个呼叫。这只是N + N而且是2N。

然而答案是2 ^ N.我不太明白。

3 个答案:

答案 0 :(得分:1)

这是一种非正式的思考方式。

假设N = 10。然后进行2次调用,一次调用N = 9,另一次调用N = 8。对于每一个,也将进行2次调用,对于N = 9,一个到N = 8和N = 7,对于N = 8,一个到N = 7,N = 6。

因此,每当N增加1时,调用次数乘以2.

因此,O(2 ^ N)是正确的。

答案 1 :(得分:1)

A的每次调用最多会产生2A次调用,N=1的基本情况会产生不变成本。总的来说,对A的调用最多会创建一个高度为N的完整二叉树,其中

sum_{i=0}^{N}2^i = 2^{N+1}-1 in O(2^{N})

节点。更正式地说,运行时绑定可以通过归纳证明获得。

答案 2 :(得分:1)

你也可以这样想:

复杂度(N)=复杂度(N-1)+复杂度(N-2)。

听起来像Fibonacci对吗?

复杂度(N)= enter image description here

因此O(phi ^ N)。其中phi = [1 + sqrt(5)] / 2