最坏情况下运行时间计算

时间:2012-08-14 08:15:00

标签: algorithm complexity-theory big-o

这是从家庭作业,但我要求一般方法。

计算以下代码的最坏情况运行时间。

int sum = 0;
for (int i = 0; i*i < N; i++)
    for (int j = 0; j < i*i; j++)
        sum++;

答案是N ^ 3/2,有人可以帮我解决这个问题吗?

有一般的方法来计算吗?

This is what I thought:

when i = 0, sum++ will be called 0 time
when i = 1, sum++ will be called 1 time
when i = 2, sum++ will be called 4 times
...
when i = i, sum++ will be called i^2 times

so the worst time will be
0 + 1 + 4 + 9 + 16 + ... + i^2

但接下来呢?我迷失在这里......

4 个答案:

答案 0 :(得分:10)

您想要计算最里面的循环运行次数。

外部将从i = 0运行到i = sqrt(N)(因为i * i

因此内部运行的总次数是:

1^2 + 2^2 + 3^2 + ... + sqrt(N)^2

有一个公式:

1^2 + 2^2 + ... + k^2 = k(k+1)(2k+1) / 6 = O(k^3).

在你的情况下,k = sqrt(N)。

总复杂度为O(sqrt(N)^3) = O(N^(3/2))

答案 1 :(得分:1)

您正在以错误的方式解决此问题。要计算最差时间,您需要找到将要执行的最大操作数。因为在双循环中只有一个操作,所以足以找出内循环执行的次数。

您可以通过检查循环的限制来执行此操作。对于外部循环,它是:

i^2 < N => i < sqrt(N)

内循环的限制是

j < i^2

您可以在第二个方面替换获得j < N

因为这些是嵌套循环,所以你可以将它们的极限相乘以得到最终结果:

sqrt(N)*N = N^3/2

答案 2 :(得分:1)

您的算法可以转换为以下形状:

int sum = 0;
for (int i = 0; i < Math.sqrt(N); i++)
    for (int j = 0; j < i*i; j++)
        sum++;

因此,我们可以直截了当地正式执行以下操作:

enter image description here

答案 3 :(得分:0)

然后只计算此总和

(i ^ 2)/ 2 * N ^(1/2)= N / 2 * N ^(1/2)= N ^(3/2)