Big o 为该代码建立重复关系?
我需要为以下算法建立一个递归关系(T(n)表示基本动作的数量),并找出它的时间复杂性:Big o 为该代码建立重复关系?,big-o,time-complexity,asymptotic-complexity,recurrence,Big O,Time Complexity,Asymptotic Complexity,Recurrence,我需要为以下算法建立一个递归关系(T(n)表示基本动作的数量),并找出它的时间复杂性: Alg (n) { if (n < 3) return; for i=1 to n { for j=i to 2i { for k=j-i to j-i+100 write (i, j, k); } } for i=1 to 7 Alg(n-2); }
Alg (n)
{
if (n < 3) return;
for i=1 to n
{
for j=i to 2i
{
for k=j-i to j-i+100
write (i, j, k);
}
}
for i=1 to 7
Alg(n-2);
}
Alg(n)
{
如果(n<3)返回;
对于i=1到n
{
对于j=i到2i
{
对于k=j-i至j-i+100
写(i,j,k);
}
}
对于i=1到7
Alg(n-2);
}
我得出了这个循环关系(不知道是否正确):
如果n<3,则T(n)=1
T(n)=7T(n-2)+100n2,否则
不过,我不知道如何计算时间复杂度
我的重现正确吗?这段代码的时间复杂度是多少?让我们看看这段代码,看看重复应该是什么 首先,让我们看看循环:
for i=1 to n
{
for j=i to 2i
{
for k=j-i to j-i+100
write (i, j, k);
}
}
这能做多少工作?好吧,让我们从简化开始。与其让j
从i
计数到2i
,不如定义一个新变量j'
,它从0
计数到i
。这意味着j'
=j-i
,因此我们得到:
for i=1 to n
{
for j' = 0 to i
{
for k=j' to j'+100
write (i, j' + i, k);
}
}
啊,那好多了!现在,让我们将k
重写为k'
,其中k'
的范围从1到100:
for i=1 to n
{
for j' = 0 to i
{
for k'= 1 to 100
write (i, j' + i, k' + j);
}
}
由此更容易看出,该循环具有时间复杂度Θ(n2),因为最里面的循环执行O(1)工作,中间的循环将运行1+2+3+4+…+n=Θ(n2)次。注意,它不完全是100n2,因为总和不完全是n2,但它很接近
现在,让我们看看递归部分:
for i=1 to 7
Alg(n-2);
首先,这简直太傻了!你没有理由想做这样的事。但是,也就是说,我们可以说,对于大小为n-2的输入,这是对算法的7次调用
因此,我们得到了这个递推关系:
T(n)=7T(n-2)+Θ(n2)[如果n≥ 3]
T(n)=Θ(1)[否则]
现在我们有了递归,我们可以开始计算时间复杂度了。这最终有点棘手。如果你想想我们最后要做多少工作,我们会得到的
- 有一个n码的电话
- 有7个大小为n-2的电话
- 有49个大小为n-4的电话
- 有343个n-6大小的电话
- 有7k个大小为n-2k的电话
希望这有帮助 正式方法是执行以下操作: 当涉及到递归调用的数量时,可以从源代码中直观地推断出当前的增长顺序 具有2个递归调用的算法的复杂度为2^n;3次递归调用的复杂度为3^n,以此类推