Big o 为该代码建立重复关系?

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

我需要为以下算法建立一个递归关系(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)
{
如果(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的电话
由此,我们立即得到Ω(7n/2)的下限,因为这是将进行的呼叫数。每个调用都有O(n2)的作用,所以我们可以得到O(n27n/2)的上限。真正的价值就在那里的某个地方,尽管我真的不知道如何弄清楚它是什么。对不起


希望这有帮助

正式方法是执行以下操作:

当涉及到递归调用的数量时,可以从源代码中直观地推断出当前的增长顺序

具有2个递归调用的算法的复杂度为2^n;3次递归调用的复杂度为3^n,以此类推