algorithm - 证明这个递归斐波那契实现运行时间为 O(2^n)?

标签 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) 吗?

最佳答案

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

T(1) = 1

T(2) = 1

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

现在,让我们猜一猜

T(n) ≤ 2n

如果我们尝试通过归纳来证明这一点,基本情况检查:

T(1) = 1 ≤ 2 = 21

T(2) = 1 ≤ 4 = 22

然后,在归纳步骤中,我们看到:

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

≤ 2n + 2n+1 + 1

< 2n+1 + 2n+1

= 2n+2

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

通过更精确的分析,您可以证明 T(n) = 2Fn - 1,其中 Fn 是第 n 个斐波那契数。这更准确地证明了 T(n) = Θ(φn),其中 φ 是黄金比例,大约为 1.61。请注意 φn = o(2n)(使用小 o 表示法),因此这是一个更好的界限。

希望这对您有所帮助!

关于algorithm - 证明这个递归斐波那契实现运行时间为 O(2^n)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19392903/

相关文章:

javascript - 根据circle1的速度计算两个圆接触的点

java - 二叉搜索树相加算法的实现

java - 用于猜测姓名字母的算法不会显示某些字母并卡在(I 和 R)之间。我怎样才能改进我的算法?

java - 为什么我的方程总是为零?

json - 如何在 F# 中对数学向量类型进行 JSON 序列化?

python - 这个功能的大O是什么?

algorithm - 计算有向图上非循环路径数的快速算法

algorithm - Tarjan 的 SCC 算法是否给出 SCC 的拓扑排序?

algorithm - 使用 Big-O 识别并说明运行时间

python - 3 Quicksorts 函数 - 为什么 lambda 版本更慢?提供代码