该算法的渐近时间复杂度

时间:2012-11-26 09:14:37

标签: algorithm time-complexity asymptotic-complexity

我想知道以下算法的时间复杂度。乍一看,时间复杂度看起来是O(n ^ 5),这就是我在互联网上看到的大多数网站所提到的。但仔细分析似乎给出了不同的答案,这里是代码:

public void fun(int n)
{
   int i,j,k,sum=0;
   for(i=0;i<n;i++)
   {
       for(j=0;j<i*i;j++)
       {
            if(j%i==0)
            {
                for(k=0;k<j;k++)
                sum++;
            }
       }
   }
}

1 个答案:

答案 0 :(得分:2)

请注意,j%i c== 0将产生true O(i)次(对于每个不同的i) - 因此内部循环将在每个&{重复O(i)次#34;外&#34;迭代。

因此,复杂性为O(n*n^2 + n*n^3) = O(n^4)

<强>说明:
O(n*n^2)用于&#34;中间循环&#34;无论对if条件的评估如何,它都会重复。它是O(n^3),因为您得到:1 + 4 + 9 + 16 + ... + n^2,这是sum of squares并且是O(n^3)
O(n*n^3)有点棘手:

对于每个i,每个内循环重复i次,因此对于每个i,您得到: i + 2i + 3i + ... + (i-1)i完全重复内循环。很容易看出它实际上是i(1 + 2 + ... + i-1) O(i^3)

现在,我们可以看到,因为它发生在每个i - 总复杂性将是(不是正式的,只是直观的):O(1^3) + O(2^3) + ... + O(n^3)O(n^4)来自sum of cubed series }}

<强>结论:
虽然冷分析可能显示O(n^5) - 因为内循环不会在中间循环的每次迭代中重复 - 总复杂度为O(n^4)