Algorithm 递归的复杂性:T(n)=T(n-1)+;T(n-2)和#x2B;C

Algorithm 递归的复杂性:T(n)=T(n-1)+;T(n-2)和#x2B;C,algorithm,complexity-theory,time-complexity,recurrence,asymptotic-complexity,Algorithm,Complexity Theory,Time Complexity,Recurrence,Asymptotic Complexity,我想了解如何得出以下递归关系的复杂性 T(n)=T(n-1)+T(n-2)+C 给定T(1)=C和T(2)=2C 通常对于像T(n)=2T(n/2)+C这样的方程(给定T(1)=C),我使用以下方法 T(n) = 2T(n/2) + C => T(n) = 4T(n/4) + 3C => T(n) = 8T(n/8) + 7C => ... => T(n) = 2^k T (n/2^k) + (2^k - 1) c 现在当n/2^k=1=>k=log(n)(到基2) 但

我想了解如何得出以下递归关系的复杂性

T(n)=T(n-1)+T(n-2)+C
给定
T(1)=C
T(2)=2C

通常对于像
T(n)=2T(n/2)+C这样的方程(给定T(1)=C),我使用以下方法

T(n) = 2T(n/2) + C
=> T(n) = 4T(n/4) + 3C
=> T(n) = 8T(n/8) + 7C
=> ...
=> T(n) = 2^k T (n/2^k) + (2^k - 1) c
现在当
n/2^k=1=>k=log(n)
(到基2)


但是,对于我所讨论的问题,我无法提出类似的方法。如果我的方法不正确,请纠正我。

您可以使用所述的一般方法。如果您有更多问题,请询问。

对于您的目的,“比指数更差”是否足够准确?特例C=0定义了指数,从本文中可以看到。假设C为正值,则序列的增长速度将超过此值。事实上,您的序列将介于斐波那契序列和斐波那契序列的一个变体之间,其中黄金分割比被稍微大一点的值所取代。

复杂性与输入大小有关,每个调用都会生成一个调用的二叉树

其中
T(n)
总共调用
2
n

T(n)=T(n-1)+T(n-2)+C

T(n)=O(2
)+O(2
n-2
)+O(1)

O(2
n

同样,可以将递归函数推广为斐波那契数

T(n)=F(n)+(C*2
n

接下来,您可以使用直接公式而不是递归方式


如果您还想找到
T(n)
的显式公式,那么使用一种称为的复杂方法可能会有所帮助

我们知道
T(1)=c
T(2)=2c
T(n)=T(n-1)+T(n-2)+c

所以只要写
T(n)
并开始扩展

T(n) = T(n-1) + T(n-2) + c
T(n) = 2*T(n-2) + T(n-m) + 2c
T(n) = 3*T(n-3) + 2*T(n-4) + 4c
T(n) = 5*T(n-4) + 3*T(n-5) + 7c
etc ...
你看,系数本身就是斐波那契数

调用
F(n)
第n个
Fibonacci数
F(n)=(phi^n+psi^n)/sqrt(5)
其中
phi=(1+sqrt(5))/2
psi=-1/phi
,那么我们有:

T(n) = F(n)*2c + F(n-1)*c + (F(n+1)-1)*c
下面是一些快速代码来演示:

def光纤发生器(n):
“”“生成fib数字以避免舍入错误”“”
fibs=[1,1]
对于X范围内的i(n-2):
fibs.append(fibs[i]+fibs[i+1])
回嘴
F=fib_gen(50)#只是一个例子。
c=1
def T(n):
“递归定义”
如果n==1:
返回c
如果n==2:
返回2*c
返回T(n-1)+T(n-2)+c
定义我们的(n):
n=n-2#只是因为你的初始值是T(1)和T(2),对不起,这太难看了!
“我们找到的关系”
返回F[n]*2*c+F[n-1]*c+(F[n+1]-1)*c


这种类型的递归称为:你必须在开始时求解齐次递归(末尾没有常数的一种)。如果你感兴趣,阅读它背后的数学知识

我会给你一个简单的方法。只需输入您的方程式,您将得到:

因此复杂性的增长方式与Lucas数或Fibonacci数(两者中较大者)的增长方式相同

但两者的增长率相同:


因此,您的增长率是黄金比率的指数:
O(phi^n)

@Aravind.。您提供的链接非常有用!
T(n) = F(n)*2c + F(n-1)*c + (F(n+1)-1)*c
>>> T(24)
121392
>>> our_T(24)
121392