我想了解如何计算if语句的时间复杂度。 我遇到了这个问题:
sum = 0;
for(i=0;i<n;i++)
{
for(j=1;j<i*i;j++)
{
if(j%i==0)
{
for(k=0;k<j;k++)
{
sum++;
}
}
}
}
现在,据我所知,对于第(1)行和第(2)行,我总共有n ^ 3,根据我的教授,总时间是n ^ 4,我也看到if语句正在测试以检查何时n ^ 2 / n的余数为0,我认为第(4)行中的for循环应该是n ^ 2,但我不知道如何计算它以便行(3)到(4)总共有O(n)。欢迎任何帮助。提前谢谢。
答案 0 :(得分:3)
让我们通过重写程序并观察一些数学事实来计算sum
:
阶段1:
for (i = 0; i < n; i++) {
for (j = 0; j < i*i; j += i) {
sum += j;
}
}
阶段2(使用算术级数):
for (i = 0; i < n; i++) {
sum += i*i * (i + 1) / 2;
}
阶段3:
Sum of cubes is a polynomial 4th degree
所以,sum = O(n^4)
。原始程序通过添加1来实现,因此需要O(n^4)
个添加。
答案 1 :(得分:0)
这里有6行实际代码。 (你把它们放在一条很难读的线上。约翰奥多姆解决了这个问题。)
1)在O(1)
中运行2)在O(n)中运行,总计为O(n)
3)在O(n ^ 2)中运行,总计为O(n ^ 3)
4)在O(1)中运行,这会过滤从O(n ^ 3)到O(n ^ 2)的输入
编辑:我错过了这个循环转到n ^ 2而不是n。
的事实5)在O(n)中运行,但这个n是原n的平方,因此它实际上是O(n ^ 2),总数是O(n ^ 4)
6)运行O(1),总计为O(n ^ 4)
因此总时间为O(n ^ 4)
但请注意:
for(j=1;j<i*i;j++)
{
if(j%i==0)
这样可以更好地重写为
for(j=i;j<i*i;j+=i)
(希望我的语法正确,自从我做完C以来已经很久了。)