用于fib递归的大O表示法

时间:2012-07-28 02:57:13

标签: java algorithm big-o fibonacci

以下功能的Big-O运行时间是多少?解释

static int fib(int n){
  if (n <= 2)
     return 1;
  else 
     return fib(n-1) + fib(n-2)
   }

另外,如何以更快的Big-O运行时间迭代地重写fib(int n)函数? 这是O(n)的最佳方式:

 public static int fibonacci (int n){
 int previous = -1;
 int result = 1;
 for (int i = 0; i <= n; ++i)
 {
 int sum = result + previous;
 previous = result;
 result = sum;
 }
 return result;
}
}

1 个答案:

答案 0 :(得分:4)

<强>证明

您可以将时间函数建模为Fib(n),以计算Fib(n-1)的时间加上计算Fib(n-2)的时间加上将它们加在一起的时间(O(1)

T(n<=1) = O(1)

T(n) = T(n-1) + T(n-2) + O(1)

你解决了这种递归关系(例如使用生成函数),你最终会得到答案。

或者,您可以绘制递归树,其深度为n并直观地确定此函数是渐近O(2 n {{1 }}。然后,您可以通过归纳证明您的猜想。

基地:)很明显

假设n = 1 T(n-1) = O(2 n-1因此

) 等于

T(n) = T(n-1) + T(n-2) + O(1) T(n) = O(2 n-1 ) + O(2 n-2 ) + O(1) = O(2功能 n

迭代版

请注意,即使这个实现仅适用于n的小值,因为Fibonacci函数呈指数增长,而32位有符号Java整数只能容纳前46个Fibonacci数

)