if(N ^ 2%N == 0)的大O表示法的时间

时间:2015-10-20 22:28:06

标签: algorithm time big-o complexity-theory

我想了解如何计算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)。欢迎任何帮助。提前谢谢。

2 个答案:

答案 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以来已经很久了。)