此嵌套循环的运行时说明

时间:2015-09-19 06:25:41

标签: algorithm big-o time-complexity

我无法理解这个循环的时间复杂性:

sum = 0;
for(i = 1; i < n; i++)
    for(j = 1; j < i * i; j++)
       if(j % i == 0)
          for(k = 0; k < j; k++)
              sum++;

我知道到达if语句需要n ^ 3次,但我很难掌握if语句为何时的时间复杂度。我在网上找到了这个解释,但我还是不明白。它没有点击我。我觉得愚蠢,但如果有人能够以更清晰的步骤解决这个问题,我会非常感激!

  

显然,if语句最多达到n ^ 3次。现在考虑多久一次   确实,这是j%i == 0的常数。对于i的每个值,j的范围从1到i ^ 2,并且j%i == 0仅当j是i的倍数时。因此j%i   仅当j = i,2i,3i,...,i ^ 2时== 0。因此if语句对于i的每个值都是真的i次。因此它确实是O(n ^ 2)倍。因此,最内圈仅达到O(n ^ 2)次。每次到达时,它迭代j = 0(n ^ 2)次。因此,执行的操作总数为O(n ^ 4)。

1 个答案:

答案 0 :(得分:1)

我建议你手动解决问题。像这样:

i = 1, j = 1, inner loop 1 time. 

i = 2, j = 1, no inner loop. 
i = 2, j = 2, inner loop 2 times
i = 2, j = 3, no inner loop. 
i = 2, j = 4, inner loop 4 times

i = 3, j = 1, no inner loop. 
i = 3, j = 2, no inner loop. 
i = 3, j = 3, inner loop 3 times. 
i = 3, j = 4, no inner loop. 
i = 3, j = 5, no inner loop. 
i = 3, j = 6, inner loop 6 times. 
i = 3, j = 7, no inner loop. 
i = 3, j = 8, no inner loop. 
i = 3, j = 9, inner loop 9 times. 

等等。对于每一个i,你多久执行一次内循环,以及它多久被迭代一次? (&#34; if&#34;语句多久执行一次 - 在这种情况下,内循环迭代的工作次数较少,但是使用不同的代码会有所不同,因此需要检查)?您为1到n-1的所有值加起来的结果。