递归斐波那契算法的复杂性


13

使用以下递归斐波那契算法:

def fib(n):
   if n==0:
      return 0
   elif n==1
      return 1
   return (fib(n-1)+fib(n-2))

如果我输入数字5来找到fib(5),我知道它将输出5,但是如何检查该算法的复杂性?如何计算涉及的步骤?



我一直在寻找相同的东西,所以我建议使用MyCodeSchool将此视频绊倒
snbk97

Answers:


23

大多数时候,您可以使用递归方程式表示递归算法。在这种情况下,此算法的递归方程为。然后,您可以使用替换方法或展开方法(或用于求解递归的任何其他方法)找到方程的闭合形式。在这种情况下,您得到,其中是黄金比率()。Ť Ñ = Θ φ Ñφ φ = 1 + T(n)=T(n1)+T(n2)+Θ(1)T(n)=Θ(ϕn)ϕϕ=(1+5)2

如果您想了解有关如何解决递归的更多信息,我强烈建议您阅读算法介绍的第4章。


0

作为递归关系/数学分析的替代方法(而不是替代方法),一种简单的经验练习(显然不是经常在课堂上教书,但非常有益)是计算函数的执行次数,然后以图形形式显示范围的计数小n个输入,然后曲线拟合结果。结果通常与理论数学方法非常匹配。

免费的在线第3章,算法的运行时间 / 计算机科学基础,Ullman ,可以找到此练习的良好支持材料。


1)绘图绝不能取代形式分析。这很容易上当。2)我认为您在虚假陈述您引用的来源。他们确实提到了绘图,但不是确定“复杂性”的一种方式。3)FWIW,我确实不同意这种方法,并且正如Ullman提出的那样使用它,但这不是您的错。
拉斐尔

1
答案基本上是从您的免责声明开始的,说绘图不能替代数学分析。绘图是一种科学方法,说/观察它有时是愚弄的,是了解/唤起数据的统计方面,这是科学分析的另一个重要方面。认为说“容易上当”是非常引人注目的,在“病理”情况下失败了,但通常是“人为”的……问题是要检查算法的复杂性,经验分析是一个关键方面/的角度,显然不是唯一的角度等...
vzn

0

fib(n)的结果是返回1的所有递归调用的总和。因此,恰好有fib(n)个递归调用评估fib(1)。因此执行时间为Ω(fib(n)); 您需要证明返回0的调用和其他递归调用对此的影响不大。

相同的推理适用于任何返回1或0或另一个递归调用的结果的递归定义的函数。


“至少O(fib(n))”-没有任何意义。您想使用。Ω
拉斐尔

如果您对此有强烈的想法,请随时编辑。
gnasher729

0

T(n)=T(n1)+T(n2) T(n)>2T(n2)T(n1)>T(n2)T(n)=Ω(cn)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.