斐波纳契系列以下程序的时间复杂度是多少?代码使用动态编程

时间:2013-09-28 14:43:48

标签: algorithm time-complexity dynamic-programming

我知道如果我不使用动态编程,根据递归关系的主方法,复杂度将为O(2 ^ n)。 T(n) = T(n-1) + T(n-2)。但是,如果我使用动态编程,那么它仍然是O(2 ^ n)?

int [ ] fib = new fib [ 32 ] ;


int fibonacci ( int n) {

      if ( n == 1 ) return 1 ;

      if ( n == 2 ) return 1 ;

      // already calculated fibonacci (n)
      if ( fib [ n ] != 0) return fib [ n ] ;

      return fib [ n ] = fibonacci ( n−1 ) + fibonacci ( n − 2 ) ;

}

2 个答案:

答案 0 :(得分:2)

它只是O(n),因为如果已经计算了值,您将立即返回一个值。这意味着,fib(n)的每个值只会为您拥有的n计算一次。

答案 1 :(得分:1)

正如dreamzor已经说过的那样,复杂性将是O(n),因为如果你用已计算的值调用斐波那契,你就会停止递归。他100%正确。

但是,更有趣的是,fib函数的调用次数实际上是2*n - 3的{​​{1}}。在实验上,验证非常简单:只需添加一个在函数n > 1中递增的全局变量counter,然后打印它。

这是因为对于尚未计算的每个fib,您将进行2次递归调用(n = 1或2除外)。

现在,有点偏离主题但是,轻微的代码重构:

n

另外,我知道您可能正在编写此函数以便学习,但您必须知道迭代形式或尾递归会更好。