C 关系T(n)=nT(n-1)+n的时间复杂度是多少

C 关系T(n)=nT(n-1)+n的时间复杂度是多少,c,algorithm,time-complexity,C,Algorithm,Time Complexity,关系Tn=nTn-1+n的时间复杂度是多少 在我的节目里是这样的 f(int n) { c++; if(n>0) for(i=1;i<=n;i++) f(n-1); } 我拿了一个计数器来计算函数调用了多少次 它给出了n到n之间的答案! 谢谢。您的代码缺少递归的+n部分,因此我假设代码是错误的,递归 T(n) = n*T(n-1) + n 这是正确的 设fn=Tn/n!,然后 因此Tn~e*n 调用该函数 n*f(n-1)

关系Tn=nTn-1+n的时间复杂度是多少 在我的节目里是这样的

f(int n)
{
    c++;
    if(n>0)
        for(i=1;i<=n;i++)
            f(n-1);
}
我拿了一个计数器来计算函数调用了多少次 它给出了n到n之间的答案! 谢谢。

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

T(n) = n*T(n-1) + n
这是正确的

设fn=Tn/n!,然后

因此Tn~e*n

调用该函数

n*f(n-1)
时代。将fn-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

我们可以列出几个术语

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

现在,我们需要上界。我们可以注意到一件事:我认为,对于所有足够大的n>=2,Tn=nTn-1+n 我建议我们可以。我们可以证明,对于任何c>0,对于足够大的n值,Tn=nTn-1+n 祝你好运。Wolfram Alpha相当清楚地表明,对于n~2.5,该函数假定的最大值约为5或6。假设你对此深信不疑,那么有什么好处呢


n!不应该有+n部分。关系Tn=n*Tn-1是n的阶乘。所以时间复杂性应该是开着的!。我忽略了+n,因为代码不支持这个计算…但是结果是一样的,因为n相对于n太小了!对于一个分数为负数的问题,看到3个几乎相同的答案是很有趣的。@sds,是的,我想我们喜欢在琐碎的cpu周期上进行头发分割。计数器c根据关系nTn-1+n即en显示值!那么为什么+n部分是错误的,我们不计算n的循环阶乘的i++部分吗-你说的+n部分是什么意思?代码递归很好。@PaulOgilvie:代码中没有需要时间n的操作。@PaulOgilvie在标题中指定了关系Tn=n*Tn-1+n,但示例代码没有证明+n是正确的。啊……是的,他在标题中这么说。@sds谢谢,我错过了外括号。我不认为T2=2*1+2。有一个初始呼叫,例如来自main。从那时起,函数被调用n次并递归。你不能把+1外推到+2,+3,+4+n、 ..这意味着T0=0+1。@PaulOgilvie在实际阅读代码片段时,我同意你说的关系不是标题中的关系是正确的。然而,我会继续争论,真正的关系更像是Tn=a+bn+cnTn-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
...