简化T(n)运行时

时间:2012-10-14 06:18:22

标签: 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)运行时间。现在,我知道你可以写

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

我不确定您是否可以进一步简化此操作,例如T(n) = 3T(n-1) + 1

2 个答案:

答案 0 :(得分:7)

S(n)= T(n)+ 1/2 ,然后 S(n)= S(n-1)+ S(n-2)+ S(的n-3)

然后 T(n) c 1 x 1 n + c 2 x 2 n + c 3 x 3 n - 1/2 ,其中 x i 是等式的根 x 3 - x 2 - x - 1 = 0 c i 是特定系数。

T(n)的准确解决方案有点复杂。实际上 x 1 = 1.84,x 2 ,x 3 = -0.42±0.61i (是的,它们是不是真实的数字)。

但是,如果 T(n)可以简化为 T(n)= 3T(n-1)+ 1 ,那么 T( n)必须像 c 1 x n + c 0 。因此,您无法进一步简化它。

答案 1 :(得分:2)

您的功能不是

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

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.

要检查,请使用以下“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

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;
}