该程序计算斐波纳契数。我想用递归关系找出它的时间复杂度。
Fib(n)
if n<=1
return n
else
x= Fib(n-1)
y= Fib(n-2)
return x+y
该程序的递推方程为 的 T(N)= T(N-1)+ T(N-2)+ C
我试图花费它,但找不到解决方案。
=2T(n-1)+T(n-3)+c+c
=3T(n-3)+2T(n-4)+c+c+3c
=5T(n-4)+3T(n-3)+c+c+3c+5c
-------------------------
-------------------------
-------------------------
答案 0 :(得分:1)
您需要考虑对您的功能进行多少次通话。 每个调用都会生成2,因此它生成一个二叉树:
名词
(N-1)--------------(N-2)
(N-2) - (N-3)------(N-3)---(N-4)
等等。
首次达到1时考虑树的级别并忽略下面的所有内容。 这发生在第n / 2级(因为每个级别的最低数字是最右边的,它总是减少2)。 很明显,每个级别上最多n / 2的节点总是两倍于前一级别的节点。
因此节点总数为1 + 2 + 2 ^ 2 + ... + 2 ^(n / 2)= 2 ^(n / 2 + 1) - 1 = O(2 ^(n / 2) ))
这意味着时间复杂度至少是指数级的。
你可以更准确地计算它,但是出于所有实际目的,这应该足以避免这种实现。
答案 1 :(得分:1)
给定的递归关系是,
T(n) = T(n-1) + T(n-2) + c ------ 1
T(n-1)= T(n-2) + T(n-3) + c ------ 2
1-2 -> T(n) = 2T(n-1) - T(n-3) ----- 3
T(n) - 2T(n-1) + T(n-3) = 0 ----- 4
4的特征方程是 x 3 - 2x 2 + 1 = 0 ---- 5
求解方程式5,
解决方案为x = 1
,x = (1 + √5)/2
和x = (1 −√5)/2
一般解决方案是, T n = a((1 +√5)/ 2) n + b((1 - √5)/ 2) n + c。 1 n
T n = a((1 +√5)/ 2) n + b((1 - √5)/ 2)< sup> n + c
让我们假设 T(0)= 0 ,从等式1我们得到 T(1)= c 和 T(2)= 2c 强>
那里, T(0)= a + b + c = 0 ---- 6
T(1)= a((1 +√5)/ 2)+ b((1 - √5)/ 2)+ c = c
a((1 +√5)/ 2)+ b((1 - √5)/ 2)= 0 ----- 7
T(2)= a((1 +√5)/ 2) 2 + b((1 - √5)/ 2) 2 + c = 2c
a((1 +√5)/ 2) 2 + b((1 - √5)/ 2) 2 = c - --- 8
求解6,7和8,得到a,b和c的值。
一般解决方案是,
T n = a((1 +√5)/ 2) n + b((1 - √5)/ 2) n + c
因为(1 +√5)/ 2&lt; 2 强>,
T(n)= O(2 n )。
答案 2 :(得分:0)
关于你的递归关系的注意事项是 与Fibonacci重复本身相同 。这意味着,无论您计算什么斐波纳契数,您都需要c
个单位的工作时间。您可以从计算的前几个步骤中自己查看。 c
开始像Fibonacci数字一样增长。
基本上你的复发归结为O(Fib(n))。 Fibonacci数在n
中是指数的,因此您将进行指数工作。
更好的方法是记住其中一个数字。像这样:
Fib(n):
if n <= 2:
return 1,0
else:
x,y = Fib(n-1)
return x+y,x
因此,当您致电Fib(n)
时,您将获得两个值,即Fib(n)和Fib(n-1)。您返回的额外x
&#34;记得&#34; Fib(n-2)所以你不必计算两次。 此重复归结为T(n) = T(n-1) + c
,即O(n)。
一旦你有了这个,你可以把它减少到一个很好的小循环:
x = 1, y = 0
for i from 3 to n:
x,y = x+y,x