我知道最里面的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++;
}
}
}
}
答案 0 :(得分:3)
修改:
现在我注意到循环顺序:i
之前的j
。
在这种情况下,给定的i
值j
从i
到n
不等,并且有(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 A006218(Dirichlet Divisor problem)
我们可以看到n的除数之和的近似值为
n * ( log(n) + 2*gamma - 1 ) + O(sqrt(n))
因此,循环计数器j
的成功if条件的平均数量为~log(j)