递归的复杂度:T(n) = T(n-1) + T(n-2) + C
Posted
技术标签:
【中文标题】递归的复杂度:T(n) = T(n-1) + T(n-2) + C【英文标题】:Complexity of the recursion: T(n) = T(n-1) + T(n-2) + C 【发布时间】:2013-07-16 20:47:49 【问题描述】:我想了解如何得出以下递归关系的复杂性。
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) = n T(1) + (n-1)C
= (2n -1) C
= O(n)
但是,对于我遇到的问题,我无法想出类似的方法。如果我的方法不正确,请纠正我。
【问题讨论】:
【参考方案1】:您可以使用here 中描述的这种通用方法。如果您有更多问题,请询问。
【讨论】:
@Aravind..您提供的链接很有帮助!【参考方案2】:对于您的目的,“比指数差”是否足够准确?特例 C=0 定义了http://en.wikipedia.org/wiki/Fibonacci_number,从文章中可以看出是指数型的。假设 C 为正,您的系列将比这增长得更快。事实上,您的系列将介于斐波那契数列和斐波那契数列的变体之间,其中黄金比例被稍大一些的东西所取代。
【讨论】:
【参考方案3】:复杂度与输入大小有关,每个调用都会产生一个调用的二叉树
T(n)
使2
n
总共调用..
T(n) = T(n-1) + T(n-2) + C
T(n) = O(2
n-1
) + O(2
n-2
) + O(1)
O(2
n
)
以同样的方式,您可以将递归函数概括为斐波那契数
T(n) = F(n) + ( C * 2
n
)
接下来可以使用直接公式代替递归方式
使用称为Binet's Formula的复杂方法
【讨论】:
【参考方案4】:如果您也有兴趣找到 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-3) + 2c
T(n) = 3*T(n-3) + 2*T(n-4) + 4c
T(n) = 5*T(n-4) + 3*T(n-5) + 7c
and so on.
您会看到系数本身就是斐波那契数!
致电F(n)
nth
斐波那契数。 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 fib_gen(n):
"""generates fib numbers to avoid rounding errors"""
fibs=[1,1]
for i in xrange(n-2):
fibs.append(fibs[i]+fibs[i+1])
return fibs
F = fib_gen(50) #just an example.
c=1
def T(n):
"""the recursive definiton"""
if n == 1:
return c
if n == 2:
return 2*c
return T(n-1) + T(n-2) + c
def our_T(n):
n=n-2 #just because your intials were T(1) and T(2), sorry this is ugly!
"""our found relation"""
return F[n]*2*c + F[n-1]*c + (F[n+1]-1)*c
和
>>> T(24)
121392
>>> our_T(24)
121392
【讨论】:
【参考方案5】:这种类型的递归称为:non-homogeneous recurrence relations,你必须在一开始解决齐次递归(最后没有常数的那个)。如果您有兴趣,请阅读其背后的数学原理。
我会告诉你一个简单的方法。只需在wolfram-alpha 中输入您的方程式,您将获得:
因此,复杂性的增长方式与卢卡斯数或斐波那契数(其中较大者)相同。
但是两者的增长率是一样的:
因此您的增长率是黄金比例的指数:O(phi^n)
【讨论】:
以上是关于递归的复杂度:T(n) = T(n-1) + T(n-2) + C的主要内容,如果未能解决你的问题,请参考以下文章