我有两个关于使用递归关系分析时间复杂度的问题。
问题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是常数。
答案 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