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)=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的值
总的解决办法是
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