【发布时间】:2014-09-21 06:38:01
【问题描述】:
我有一个由以下给出的递归关系:
T(n)=4T(n-1) - 3T(n-2)
我该如何解决这个问题? 任何详细解释:
我尝试的是使用关系替换右侧的T(n-1),我得到了这个:
=16T(n-2)-12T(n-3)-3T(n-2)
但我不知道在哪里以及如何结束。
【问题讨论】:
标签: algorithm big-o time-complexity recurrence
我有一个由以下给出的递归关系:
T(n)=4T(n-1) - 3T(n-2)
我该如何解决这个问题? 任何详细解释:
我尝试的是使用关系替换右侧的T(n-1),我得到了这个:
=16T(n-2)-12T(n-3)-3T(n-2)
但我不知道在哪里以及如何结束。
【问题讨论】:
标签: algorithm big-o time-complexity recurrence
你不仅可以很容易地得到这个递归的时间复杂度,而且你甚至可以精确地解决它。这要归功于线性递推关系背后的详尽理论,您在这里调用的是homogeneous linear recurrence 的一个具体案例。
要解决它,您需要编写一个特征多项式:t^2 -4t +3 并找到它的根,它们是 t=1 和 t=3。这意味着您的解决方案是以下形式:
T(n) = c1 + 3^n * c2.
如果您有边界条件,您可以获得c1 和c2,但对于您的情况,声明O(3^n) 时间复杂度就足够了。
【讨论】:
虽然显然是O(4^n)(因为T(n)<=4*T(n-1)),但看起来可以证明一个更小的限制:
T(n) = 4*T(n-1) - 3*T(n-2)
T(n) - T(n-1) = 3*T(n-1) - 3*T(n-2)
D(n) = T(n) - T(n-1)
D(n) = 3*D(n-1)
D(n) = D(0) * 3^n
如果D(0)=0,T(n)=const=O(1)
否则,由于差异是指数的,因此结果函数也将是指数的:
T(n) = O(3^n)
【讨论】:
注意:-一般来说,这些循环关系(循环函数调用的次数是重复的,例如-recurrence relation for a fibonacci sequence for value n)将导致指数时间复杂度。
首先,您的问题不完整。它不提供终止条件(循环将终止的条件)。我认为它必须是
T(n) = 1,n=1,2,n=2
基于这个假设,我开始分解上面的递归关系
将 T(n) 代入 T(n-1) 我得到了:
16T(n-2) - 24T(n-3) + 9T(n-4)
这形成了一个 2 次方的多项式
{(4^2)T(n-2) - 2.4.3 T(n-3) + (3^2) T(n-4)}
再次打破上述重复,我们得到:
64T(n-3) -144T(n-4) + 108T(n-5) -27T(n-6)
这是3次幂的多项式
在分解 n-1 项的关系时,我们将得到:
(4^n-1) T(1) - ............. 类似的东西
我们可以清楚地看到,在上面的扩展中,所有剩余的项都将小于 4^n-1 因此,我们可以将渐近符号表示为:
O(4^n)
作为一个练习,您可以将多项式扩展为更多项,还可以绘制递归树以找出实际发生的情况。
【讨论】:
尝试 T(n) = x^n 会得到一个二次方程:x^2 = 4x - 3。这有解 x=1 和 x=3,所以 T(n) 的一般形式是 a + b *3^n。 a 和 b 的确切值取决于初始条件(例如,T(0) 和 T(1) 的值)。
根据初始条件,解将是 O(1) 或 O(3^n)。
【讨论】: