什么是时间复杂度关系T(n)= nT(n-1)+ n

时间:2016-02-25 17:19:56

标签: c algorithm time-complexity

关系的时间复杂度T(n)= nT(n-1)+ n 在我的编程像这样

f(int n)
{
    c++;
    if(n>0)
        for(i=1;i<=n;i++)
            f(n-1);
}

我拿了一个计数器来计算调用多少时间函数 它给出了n到n之间的答案! 感谢。

3 个答案:

答案 0 :(得分:1)

您的代码缺少递归的+n部分,因此我假设代码错误并且递归

T(n) = n*T(n-1) + n

是对的。

f(n)=T(n)/n!,然后

f(n) = T(n)/n! = n(T(n-1)+1)/n! 
     = T(n-1)/(n-1)! + 1/(n-1)!
     = f(n-1) +  1/(n-1)!
     = sum(1,n-1, 1/k!)
     ~ e

因此T(n) ~ e*n!

答案 1 :(得分:-1)

该功能称为

n*f(n-1)

次。用这个定义替换f(n-1)给出了

n*((n-1)*f(n-2)

再次更换:

n*((n-1)*((n-2)*f(n-3)))

删除括号:

n*(n-1)*(n-2)*...(1)

这给出了:

n= 3: 3*2*1 = 6
n= 4: 4*3*2*1 = 24
n= 5: 5*4*3*2*1 = 120

n!

答案 2 :(得分:-1)

我们可以列出几个术语

T(0) = 0
T(1) = 1 * 0 + 1
T(2) = 2 * 1 + 2 = 4
T(3) = 3 * 4 + 3 = 15
T(4) = 4 * 15 + 4 = 64
...

我们可以注意到一些事情。首先,函数的增长速度比n!它开始小于它(在n = 0),赶上(在n = 1)并超过它(在n> = 2)。所以我们知道下限是n!。

现在,我们需要上限。我们可以注意到一件事:T(n)= nT(n-1)+ n&lt;对于所有足够大的n(n> = 2,我认为),nT(n-1)+ nT(n-1)。但我们可以很容易地证明T(n)= nT(n-1)是n!的递归关系,因此我们知道T(n)= nT(n-1)+ nT(n-1)的递归关系)= 2nT(n-1)是(n!)(2 ^ n)。我们可以做得更好吗?

我建议我们可以。我们可以证明对于任何c> 0,T(n)= nT(n-1)+ n <0。对于足够大的n值,nT(n-1)+ cnT(n-1)。我们已经知道T(n-1)的下限是(n-1)!所以,如果我们采取c = n /(n-1)!我们确切地恢复了我们的表达式,我们知道上限是(c ^ n)(n!)。当n变为无穷大时,c的极限是多少? 0. [n /(n-1)!] ^ n?

假设的最大值是多少

祝你好运计算。 Wolfram Alpha非常清楚地表明,对于n~2.5,此函数假设的最大值约为5或6。假设你确信这是什么,那么它是什么?

N! &LT; T(n)&lt; 〜6N!对于所有人N!是你的复发的Theta-bound。