使用递归关系的算法时间复杂度

时间:2017-09-22 07:25:01

标签: algorithm asymptotic-complexity proof

我有两个关于使用递归关系分析时间复杂度的问题。

问题1.如何在使用memoization时形成算法的递归关系?这甚至可能吗?

例如,考虑计算Fibonacci序列的第n项。算法将是:

fib(n)
    if n < 2
        return n
    else
        return fib(n-1)+fib(n-2)

这段代码的递归关系是:

T(n)= T(n-1)+ T(n-2)+ c。这个时间复杂度大约是2 ^ n。

此代码的备忘版本为:

MemFib(n)
    if n < 2
        return n
    else
        if F[n] is undefined
            F[n] = MemFibo(n − 1) + MemFibo(n − 2)
        return F[n]

(注意:我从Jeff Erickson的笔记中得到了这个,可以在这里找到:http://jeffe.cs.illinois.edu/teaching/algorithms/。这个算法在第5章 - 动态编程中)

这是O(n)的复杂性。我理解为什么这是O(n),因为我们将值存储在表'F'中并尽可能地执行查找但是我不知道如何以数学方式证明这一点。

现在对我而言,似乎递归关系与第一个例子(T(n-1)+ T(n-2)+ c)相同,这显然是错误的。你怎么写这个的递归关系?是否可以为此编写关系,因为我们不会一直执行递归调用?如果不可能,您如何正式证明时间复杂度为O(n)?

问题2.如何分析以下格式的算法的复杂性:

T(n)= a T(n / b)+ c T(n / d)+ x?

这里x是常数。

1 个答案:

答案 0 :(得分:0)

对于第一个问题,递归关系不再为真,因为T(n)可能有两个值,具体取决于它是否已被调用(O(n)或O(O) 1))。

编写重复的方法是区分第一次和第二次调用:

Tf(n) = Tf(n-1) + Ts(n-2) + c = Tf(n-1) + O(1) + c = O(n).

对于第二个问题,可以扩展主定理:

在x = O(1)的具体示例中:

T(n) = θ(n^γ) with γ such as a*(1/b)^γ + c*(1/d)^γ = 1