证明这个递归的Fibonacci实现在时间O(2 ^ n)运行?

时间:2013-10-15 23:35:36

标签: algorithm math big-o fibonacci proof

我很难证明斐波那契的'坏'版本是O(2 ^ n)。 IE浏览器。 鉴于功能

int fib(int x)
{
  if ( x == 1 || x == 2 )
  {
    return 1;
  }
  else
  {
    return ( f( x - 1 ) + f( x - 2) );
  }
}

我可以获得有关O(2 ^ n)的证据的帮助。

4 个答案:

答案 0 :(得分:6)

让我们从编写运行时的递归关系开始:

  

T(1)= 1

     

T(2)= 1

     

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

现在,让我们猜一下

  

T(n)≤2 n

如果我们试图通过归纳来证明这一点,那么基本案例会检查出来:

  

T(1)=1≤2= 2 1

     

T(2)=1≤4= 2 2

然后,在归纳步骤中,我们看到了这一点:

  

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

     

≤2 n + 2 n + 1 + 1

     

< 2 n + 1 + 2 n + 1

     

= 2 n + 2

因此,通过诱导,我们可以得出结论:对于任何n,T(n)≤2 n ,因此T(n)= O(2 n )。

通过更精确的分析,您可以证明T(n)= 2F n - 1,其中F n 是第n个Fibonacci数。这更准确地证明了T(n)=Θ(φ n ),其中φ是黄金比率,其约为1.61。请注意,φ n = o(2 n )(使用小写符号),因此这是一个更好的约束。

希望这有帮助!

答案 1 :(得分:0)

尝试手动执行一些测试用例,例如f(5),并记下调用方法f()的次数。

胖的提示是注意每次调用方法f()时(除了x是1或2),f()被调用两次。每个人每次致电f()两次,依此类推......

答案 2 :(得分:0)

实际上有一个非常简单的证明,f的总呼叫数将是2Fib(n)-1,其中Fib(n)是第n个斐波纳契数。它是这样的:

  1. f的调用形成一个二叉树,其中每个调用都是一个叶子(对于x = 1或x = 2),否则该调用会产生两个子调用(对于x> 2)。
  2. 每个叶子对原始调用返回的总数的贡献恰好为1,因此总共有Fib(n)个叶子。
  3. 任何二叉树中的内部节点总数等于L-1,其中L是叶数,因此该树中的节点总数为2L-1
  4. 这表明运行时间(以f的总呼叫数衡量)为

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

    以及Fib(n)=Θ(φ^n)以来,其中φgolden ratio

    Φ=(1+sqrt{5})/2 = 1.618...
    

    这证明T(n) = Θ(1.618...^n) = O(n)

答案 3 :(得分:0)

使用递归树方法:

                                             T(n)                         
                                       ↙            ↘
                                   n-1              n – 2                                 
                               ↙      ↘             ↙      ↘
                           N – 2      n – 3      n – 3       n - 4   

如果以这种方式完成递归树,则每个树级别都被视为对fib(x - 1)fib(x - 2)的调用,当x = 1或x = 2(基本情况)时,您将停止。 ..这个树只显示递归树的三个级别。要解决这棵树,您需要以下重要信息:1-树的高度。 2 - 每个级别完成了多少工作。 这棵树的高度是2 ^ n,每个级别的工作是O(1)然后这个重复的顺序是高度*每个级别的工作= 2 ^ n * 1 = O(2 ^ n)