循环三重增长的顺序

时间:2015-04-16 15:55:07

标签: time-complexity

我正在练习算法的复杂性,我在网上看到了这个代码,但我无法弄清楚它的增长顺序。有什么想法吗?

    int counter= 0;
    for (int i = 0; i*i < N; i++)
    for (int j = 0; j*j < 4*N; j++)
    for (int k = 0; k < N*N; k++)
    counter++;

2 个答案:

答案 0 :(得分:2)

一次一步(或在这种情况下循环):

  1. 第一个循环会增加i,只要其平方低于N,因此必须为O(sqrt N),因为int(sqrt(N))int(sqrt(N)) - 1是最大的整数值,其平方值低于N;

  2. 第二个循环也是如此。我们可以忽略4,因为它是一个常数,我们在处理大符号时并不关心它们。所以前两个循环是O(sqrt N)*O(sqrt N) = O(sqrt(N)^2) = O(N)。您可以将复杂性相乘,因为循环是嵌套的,因此第二个循环将完全执行第一个循环的每次迭代;

  3. 第三个循环显然是O(N^2),因为k上升到N的平方。

  4. 所以整件事必须是O(N) * O(N^2) = O(N^3)。您通常可以通过计算第一个循环的复杂性来解决这样的问题,然后是第二个循环,然后是前两个循环,依此类推。

答案 1 :(得分:1)

Sqrt n x 2 Sqrt n x n ^ 2

给出了:

O n ^ 3

说明:

对于第一个循环,方程两边的平方根

i ^ 2 = n

对于第二个循环,方程两边的平方根

j ^ 2 = 4n ^ 2

第三个循环是直截了当的。