分析具有递推的算法T(n)= T(n-1)+ T(n-2)+ T(n -3)?

时间:2013-06-21 21:07:37

标签: algorithm math complexity-theory big-o

所以,有人早先发布了这个question,但基本上没有付出任何努力,它标记很差,然后关闭。尽管如此,我认为这可能是个好问题。我发帖是因为根据OP,我的回答(发表在评论中)与解决方案不一致。所以,我试图弄清楚我做错了什么(假设他的答案确实正确):

我们有:

T(N) = T(N-1) + T(N-2) + T(N-3)

其中N>他没有列出基本案例,但是因为N> 3,我假设T(3)T(2)T(1)可能有3个基本案例。要计算T(K),我们会执行以下操作:

T(K) = T(K-1) + T(K-2) + T(K-3)

然后我们必须计算:

T(K-1) = T((K-1)-1) + T((K-1)-2) + T((K-1)-3)
T(K-2) = T((K-2)-1) + T((K-2)-2) + T((K-2)-3)
T(K-3) = T((K-3)-1) + T((K-3)-2) + T((K-3)-3)

依旧...... 这是一个树形表示:

L0                                                  T(K)
                      /                              |                              \
L1               T(K-1)                            T(K-2)                           T(K-3)
          /         |     \                 /        |          \                 /   |     \
L2   T((K-1)-1) T((K-1)-2) T((K-1)-3)  T((K-2)-1) T((K-2)-2) T((K-2)-3) T((K-3)-1) T((K-3)-2) T((K-3)-3)    
                 ...                                ...                                ...

所以我们有3个孩子,然后是9个孩子,然后是27个孩子......,直到我们打到我们的基础病例。因此,该算法为O(3^(N-3))N-3用于解释三个基本情况,即在T(4)之后,我们只能有基础情况,不再有分支。

从未提供过实际的解决方案,但就像我说的那样,我告诉我这是不正确的。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:9)

您已设置的重复发生如下:

  

T(n)= T(n - 1)+ T(n - 2)+ T(n - 3)

我认为基本情况可能是

  

T(0)= T(1)= T(2)= 1

如果您开始扩展此重复的条款,则会获得

  • T(0)= 1
  • T(1)= 1
  • T(2)= 1
  • T(3)= 3
  • T(4)= 5
  • T(5)= 9
  • T(6)= 17
  • T(7)= 31
  • ...

这里似乎没有明显的模式。幸运的是,我们可以转到在线整数序列百科全书并按照1,1,1,3,5,9,17这些条款进行操作,你会发现这是Tribonacci sequence,其前三个术语是1

如果您查看有关Tribonacci数字的信息,您会看到以下内容:

  

a(n)/ a(n-1)倾向于tribonacci常数,1.839286755 ......

(这里,a(n)是网站用于我的T(n)的表示法)。由于Tribonacci序列的连续项的比率倾向于约1.839286755,我们知道Tribonacci序列必须呈指数增长,并且它以大约Θ的速率指数增长(1.839286755 n )。 (将其与Fibonacci序列进行比较,已知其在Θ(φ n )处生长,其中φ是黄金比率)。在Wikipedia上进一步阅读会给出Tribonacci常数的公式:

enter image description here

并确认指数增长率。

因此,我们可以得出结论,运行时为Θ(1.839286755 n )。

那么......你将如何自己计算?最简单的方法是使用generating functions(我认为这些值已知的方式)。您可以尝试为此处写出的重复导出生成函数,然后尝试以闭合形式重写生成函数以获取精确值。这是获得Fibonacci数字的封闭形式的一种方法,它应该在这里概括(尽管可能是通过令人不愉快的数学进行大量讨论。)或者,正如@tmyklebu指出的那样,你可以写出这个矩阵:

     | 0 1 0 |
 M = | 0 0 1 |
     | 1 1 1 |

并计算其特征值,其中最大的特征值将出现在Tribonacci常数上。 (请注意,此矩阵具有

的属性
 | 0 1 0 |   |a|   |    b    |
 | 0 0 1 | x |b| = |    c    |
 | 1 1 1 |   |c|   |a + b + c|

因此,如果将重复的三个连续值放入列向量v并计算Mv,则会返回一个新的列向量,其中包含重复的后两个值,以及重复中的下一个值。通过这种方式,您可以通过计算M k v并查看向量的第一个分量来计算递归的第k个值。)

希望这有帮助!

答案 1 :(得分:8)

这是我学到的一种很酷的方法,所以我想我会与你分享。估计时间复杂度真的很简单。 看一下复发,我们猜测时间复杂度是指数级的。

让我们说:

T(N)=x^n

给定的重复是

T(N) = T(N-1) + T(N-2) + T(N-3)

代替

 x^n = x^n-1  + x^n-2  + x^n-3
Dividing throughout by x^n-3
 x^3 = x^2    + x^1    + 1
Rearranging
 x^3 - x^2 - x - 1=0

你可以找到它的立方根here

这个三次方程有一个实根(1.8392867552141612)和两个复根(大小为0.7373527)。

因此,渐近我们算法的运行时间受 T(N)= 1.839 ^ n 的限制。

答案 2 :(得分:0)

正如少数人注意到的,这种复发与原始复发T(N) = T(N-1) + T(N-2) - T(N-3)不同。我更喜欢假设@Aravind给出T(N)=x^N的方法。通过此重复,您将获得特征等式x^3-x^2-x+1=(x-1)^2(x+1)。 (这将是@templatetypedef矩阵方法的特征方程,如果你采用这种方法,则是生成函数的分母。)

重复的根源会造成各种困难。矩阵不可对角化。当你考虑它时,生成函数有一个重复的分母。当您假设T(N)=x^N时,您只能获得两个线性独立的解决方案,并且需要第三个解决方案。

通常,当您假设T(N)=x^N并获得双根r时,这意味着线性独立解决方案为r^NN*r^N(三重根将引入N^2*r^N {1}})。因此,在我们的案例中,重复的三个线性独立解决方案是(-1)^N1^N=1N*1^N=N。这意味着一般解决方案为T(N)=A(-1)^N+B+C*N,您可以使用初始条件来确定ABC。如果是C!=0,则为T(N)=Θ(N),否则为T(N)=Θ(1)。对于算法而言,这可能不太现实。