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

Worst-case running time using Big-Θ notation

我明白最里面的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++;
            }
        }
   }
}

编辑:
现在我注意到循环顺序:ij.

之前

在这种情况下,对于给定的 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 (number of divisors) and represented as sequence A006218 (Dirichlet Divisor problem)

的总和有关

我们可以看到对于不超过 n 的值,除数之和的近似值是

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

所以循环计数器 j 的平均成功 if 条件数是 ~log(j)