递归的复杂性:T(n)= T(n-1)+ T(n-2)+ C.

时间:2013-07-18 04:07:50

标签: algorithm complexity-theory time-complexity recurrence asymptotic-complexity

我想了解如何达到以下递归关系的复杂性。

T(n) = T(n-1) + T(n-2) + C 给定T(1) = CT(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)

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

5 个答案:

答案 0 :(得分:6)

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

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 )

以同样的方式,您可以将您的递归函数概括为Fibonacci数

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

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

使用称为Binet's Formula

的复杂方法

答案 1 :(得分:4)

您可以使用here所述的一般方法。请询问您是否还有其他问题。

答案 2 :(得分:4)

对于您的目的,“比指数更差”是否足够准确?特殊情况C = 0定义http://en.wikipedia.org/wiki/Fibonacci_number,您可以从文章中看到它是指数的。假设C是正数,那么你的系列会比这更快。事实上,你的系列将介于Fibonacci系列和Fibonacci系列的变体之间,其中黄金比例被更大的东西取代。

答案 3 :(得分:1)

如果您也有兴趣找到T(n)的明确公式,这可能会有所帮助。

我们知道T(1) = cT(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 ...

你看到系数本身就是Fibonacci数字!

致电F(n) nth斐波纳契数。 F(n) = (phi^n + psi^n)/sqrt(5) phi = (1+sqrt(5))/2psi = -1/phi,我们有:{/ p>

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

答案 4 :(得分:0)

这种类型的重复被称为:non-homogeneous recurrence relations,你必须在开始时求解均匀重复(最后没有常数的那个)。如果你有兴趣,请阅读它背后的数学。

我会告诉你一个简单的方法。只需在wolfram-alpha中输入等式即可得到:

enter image description here

因此,复杂性的增长方式与Lucas或Fibonacci数字(它们中的较大者)相同。

但两者都有相同的增长率:

enter image description here enter image description here

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