使用Big-Θ表示法的最坏情况下的运行时间

时间:2018-09-19 03:17:18

标签: algorithm big-o code-analysis analysis

我知道最里面的for循环是Θ(logn)  并且最外面的两个for循环是Θ(n ^ 2),因为它是算术和。 if语句是我的主要问题。有人知道如何解决这个问题吗?

int tally=0;
for (int i = 1; i < n; i ++)
{
   for (int j = i; j < n; j ++)
   {
        if (j % i == 0)
        {
            for (int k = 1; k < n; k *= 2)
            { 
                tally++;
            }
        }
   }
}

1 个答案:

答案 0 :(得分:3)

修改:
现在我注意到循环顺序:i之前的j

在这种情况下,给定的ijin不等,并且有(n/i)个成功的if条件。

因此程序将调用大多数内部循环

n/1 +n/2+n/3+..+n/n

次。这是harmonic series的总和,收敛到n*ln(n)

因此,内部循环将执行n*log^2(n)次。

正如您所写,两个最外面的循环提供了O(n^2)的复杂度,因此总体复杂度为O(n^2 + n*log^2(n)),第一个项覆盖了第二个循环,最后,总体复杂度是二次的。

int tally=0;
for (int i = 1; i < n; i ++)
{  
   // N TIMES
   for (int j = i; j < n; j ++)
   {  
     //N*N/2 TIMES
        if (j % i == 0)
        {
         //NlogN TIMES
            for (int k = 1; k < n; k *= 2)
            { 
             //N*logN*logN
                tally++;
            }
        }
   }
}

旧答案(错误)

此复杂度与sigma0(n) function(除数的数量)相关联,并表示为sequence A006218Dirichlet Divisor problem

我们可以看到n的除数之和的近似值为

  n * ( log(n) + 2*gamma - 1 ) + O(sqrt(n))

因此,循环计数器j的成功if条件的平均数量为~log(j)