大O剩余/模数循环

时间:2014-01-28 21:36:12

标签: for-loop big-o modulo

我正在研究一个功能:

total = 0;
for (i = 0; i < N; i++){
  for (j = 0; j < i*i; j++){
     if (j % i == 0){
        for (k=0; k <  j; k++){
          total++;

当你将它分解时,我为这个N ^ 4或N ^ 5的大O号。我不知道如何处理该内循环的%符号和运行时间。

1 个答案:

答案 0 :(得分:1)

大致相当的代码是

total=0;
for (i=1; i<=N; i++)
    for(j=1; j <= i*i; j+= i)
        for (k=1; k <= j; k++)
            total++;

j限制为可以被i整除的值。将每个变量的范围移动一个避免了i = 0的问题。

再次重写

total=0;
for (i=1; i<=N; i++)
    for(j=1; j <= i; j+= 1)
        for (k=1; k <= j*j; k++)
            total++;

j循环迭代次数相同,但是直接在平方数上进行迭代,我们简单地迭代简单整数并将乘法移到k循环中。从这一点来看,应该更容易证明total增量为O(N ^ 4)次:内部k循环运行O(N ^ 2)次,并且自身迭代O( N ^ 2)值。