Algorithm 简化T(n)运行时
给定以下函数Algorithm 简化T(n)运行时,algorithm,runtime,analysis,Algorithm,Runtime,Analysis,给定以下函数 int g(int y) { if (y <= 0) { return 1; } else { return g(y-1) + g(y-2) + g(y-3); } } 我只是不确定你是否可以进一步简化它,比如T(n)=3T(n-1)+1?让S(n)=T(n)+1/2,然后S(n)=S(n-1)+S(n-2)+S(n-3) 然后T(n)应该是c1x1n+c2x2n+c3x3n-1/2,其中xi是方程的根x3-x2-x-1=0,ci是特定系数
int g(int y) {
if (y <= 0) {
return 1;
}
else {
return g(y-1) + g(y-2) + g(y-3);
}
}
我只是不确定你是否可以进一步简化它,比如T(n)=3T(n-1)+1
?让S(n)=T(n)+1/2,然后S(n)=S(n-1)+S(n-2)+S(n-3)
然后T(n)应该是c1x1n+c2x2n+c3x3n-1/2,其中xi是方程的根x3-x2-x-1=0,ci是特定系数
T(n)的精确解有点复杂。实际上,x1=1.84,x2,x3=-0.42±0.61i(是的,它们不是实数)
然而,如果T(n)可以简化为类似T(n)=3T(n-1)+1的形式,那么T(n)必须类似于c1xn+c0。因此,您不能进一步简化它。您的函数不可用
T(n) = T(n-1) + T(n-2) + T(n-3) + 1
是的
要进行检查,请使用以下“y”运行原始函数
g(0) = 1
g(1) = 3
g(2) = 5
g(3) = 9 (i.e. = g(0) + g(1) + g(2) = 9, not g(1) + g(2) + g(3) + 1 = 10)
使用动态规划避免重新计算已计算的T(n)s
intg(inty)
{
如果(y阶,或精确?阶数分析很容易;精确分析涉及Tribonaci序列。嗯,我们能把它写成线性系统的矩阵方程吗?是的,你能。事实上,这就是解决大多数线性递归的方法。精确解是通过对所得递归矩阵进行对角化来给出的。@NickNicolini:“仅仅找到T(n)运行时间”…O(n)比T(n)更容易找到,而不是更难!是的,T(n)意味着精确的运行时间,O(n)将找到T(n)的顺序(这更容易)。
if n > 2
T(n) = T(n-1) + T(n-2) + T(n-3)
or
T(n) = 1, 3, 5 for n = 0, 1, 2 respectively.
g(0) = 1
g(1) = 3
g(2) = 5
g(3) = 9 (i.e. = g(0) + g(1) + g(2) = 9, not g(1) + g(2) + g(3) + 1 = 10)
int g(int y)
{
if(y <= 0)
return 1;
if(y == 1)
return 3;
if(y == 2)
return 5;
int a1 = 1; int a2 = 3; int a3 = 5;
int ret = 1;
for(int i = 2; i < y; ++i)
{
ret = a1 + a2 + a3;
a1 = a2;
a2 = a3;
a3 = ret;
}
return ret;
}