Algorithm 利用递推关系计算程序的时间复杂度

Algorithm 利用递推关系计算程序的时间复杂度,algorithm,math,recursion,time-complexity,Algorithm,Math,Recursion,Time Complexity,这个程序计算斐波那契数。我想用递推关系找出它的时间复杂度 Fib(n) if n<=1 return n else x= Fib(n-1) y= Fib(n-2) return x+y 您需要考虑对函数进行了多少次调用。 每个调用生成2,因此它生成一个二叉树: n (n-1)-----(n-2) (n-2)——(n-3)——(n-3)——(n-4) 等等 当您第一次达到1时,请考虑树的级别,忽略下面的所有内容。 这发生在级别n/2上(因为每个级别的最低数量是最右边的,并且

这个程序计算斐波那契数。我想用递推关系找出它的时间复杂度

Fib(n)
if n<=1
  return n
else
  x= Fib(n-1)
  y= Fib(n-2)
  return x+y

您需要考虑对函数进行了多少次调用。 每个调用生成2,因此它生成一个二叉树:

n

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

这意味着时间复杂度至少是指数的

您可能可以更精确地计算它,但对于所有实际目的来说,这应该足以避免这种实现。

关于递归关系需要注意的是,它与斐波那契递归本身是相同的。这意味着无论你在计算什么斐波那契数,你都在做
c
工作时间单位。您可以从计算的前几个步骤中看到它。
c
开始像斐波那契数一样增长

基本上你的复发归结为O(Fib(n))。斐波那契数在
n
中是指数的,所以你要做指数功

更好的方法是记住其中一个数字。像这样:

Fib(n):
    if n <= 2:
        return 1,0
    else:
        x,y = Fib(n-1)
        return x+y,x

给定的递推关系为

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的特征方程是x3-2x2+1=0---5

解方程5

解决方案是
x=1
x=(1+√5) /2
x=(1−√5) /2

总的解决办法是, Tn=a(1+√5) /2)n+b((1-√5) /2)n+c。1n

对于Tn=a((1+√5) /2)n+b((1-√5) /2)n+c

让我们假设T(0)=0,从方程1我们得到T(1)=cT(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的值

总的解决办法是

Tn=a(1+√5) /2)n+b((1-√5) /2)n+c

(1+√5) /2<2


T(n)=O(2n)。这个术语“复杂性”是什么?“这不是我所知道的数学概念……”Killercam在想,我不确定我会称之为什么。也许我刚刚忘记了“复杂性”这个词的用法。无论如何,它将是n阶(或O(n))。它不会像写的那样是线性的。如前所述,它将是O(Fib(n)),它是指数的。您需要记住以前的返回值以使其线性化。简单地说,当你计算x时,你需要考虑y,因为它是x的一部分。如果你不这样做,你就做了太多的工作。但是有可能用递推方程证明这个程序的时间复杂度是指数级的吗?
x = 1, y = 0
for i from 3 to n:
    x,y = x+y,x
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