Algorithm 分析了一种递归T(n)=T(n-1)+;T(n-2)和"x2B,;T(n-3)?
所以,有人在早些时候发布了这篇文章,但基本上没有投入任何精力,它的标签很差,然后关闭了。尽管如此,我认为这可能是一个好问题。我发帖是因为根据OP,我的回答(在评论中发帖)与解决方案不一致。因此,我试图找出我做错了什么(假设他给出的答案确实正确): 我们有:Algorithm 分析了一种递归T(n)=T(n-1)+;T(n-2)和"x2B,;T(n-3)?,algorithm,math,complexity-theory,big-o,Algorithm,Math,Complexity Theory,Big O,所以,有人在早些时候发布了这篇文章,但基本上没有投入任何精力,它的标签很差,然后关闭了。尽管如此,我认为这可能是一个好问题。我发帖是因为根据OP,我的回答(在评论中发帖)与解决方案不一致。因此,我试图找出我做错了什么(假设他给出的答案确实正确): 我们有: T(N) = T(N-1) + T(N-2) + T(N-3) 其中N>3。他没有列出基本情况,但由于N>3,我假设t(3)、t(2)和t(1)可能有3个基本情况。要计算T(K),我们执行以下操作: T(K) = T(K-1) + T(K-
T(N) = T(N-1) + T(N-2) + T(N-3)
其中N>3。他没有列出基本情况,但由于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)之后,我们只能有基本情况,没有更多分支
实际的解决方案从未提供,但正如我所说,我被告知这是不正确的。如果您有任何帮助,我们将不胜感激。您设置的重现期如下:
T(K) = T(K-1) + T(K-2) + T(K-3)
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
T(K) = T(K-1) + T(K-2) + T(K-3)
a(n)/a(n-1)趋向于Tribonaci常数,1.839286755
(这里,a(n)是站点用于我的T(n)的符号)。由于Tribonaci序列的连续项比率趋向于约1.839286755,我们知道Tribonaci序列必须呈指数增长,并且其以约为Θ(1.839286755n)的速率呈指数增长。(将其与斐波那契序列进行比较,斐波那契序列在Θ(φn)处增长,其中φ是黄金比率)。进一步阅读后,给出了Tribonaci常数的公式:
并证实了指数增长率
因此,我们可以得出结论,运行时为Θ(1.839286755n)
所以。。。你自己怎么计算呢?最简单的方法就是使用。你可以试着为你在这里写的循环推导一个生成函数,然后试着用一个封闭的形式重写生成函数,以得到精确的值。这是获得斐波那契数闭合形式的一种方法,应该在这里进行推广(尽管可能需要进行大量令人不快的数学运算)。或者,正如@tmyklebu所指出的,您可以写出以下矩阵:
| 0 1 0 |
M = | 0 0 1 |
| 1 1 1 |
计算出它的特征值,其中最大的就是Tribonaci常数。(请注意,此矩阵具有以下特性:
| 0 1 0 | |a| | b |
| 0 0 1 | x |b| = | c |
| 1 1 1 | |c| |a + b + c|
因此,如果将递归中的三个连续值放入列向量v并计算Mv,则返回一个新列向量,该列向量包含递归中的后两个值,以及递归中的下一个值。这样,可以通过计算Mkv并查看第一个分量来计算递归的第k个值(向量的一部分。)
希望这有帮助 这是我学到的一个很酷的方法,所以我想与大家分享一下。估计时间复杂度非常简单。 从重现性来看,我们猜测时间复杂度是指数的 让我们说:
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
你可以找出它的立方根
这个三次方程有一个实根(1.8392867552141612)和两个复数根(数量级为0.73527)
因此,我们的算法的运行时间是以T(N)=1.839^N为界的,正如一些人所注意到的,这种递归不同于原始递归
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^N
和N*r^N
(三重根将引入N^2*r^N
)。所以在我们的例子中,递归的三个线性独立解是(-1)^N
,1^N=1
,和N*1^N=N
。这意味着一般解是T(N)=a(-1)^N+B+C*N
,您可以使用初始条件来确定a
、B
和C
。如果C=0,则T(N)=Θ(N)
,否则T(N)=Θ(1)
。这对于一个算法来说可能不太现实。这在一个算法的上下文中有意义吗?子问题的时间减法是什么时候发生的?我不知道最初的问题是从哪里来的。尽管如此,一个ca