使用递归关系的程序的时间复杂度

时间:2013-04-03 08:41:32

标签: algorithm math recursion time-complexity

该程序计算斐波纳契数。我想用递归关系找出它的时间复杂度。

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
 -------------------------
 -------------------------
 -------------------------

3 个答案:

答案 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 = 1x = (1 + √5)/2x = (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