for (int i = 0; i*i < N; i++)
for (int j = 0; j*j < N*N*N; j++)
sum++;
这是课程中算法,第一部分课程中的练习之一。
外部for循环是N的平方根,内部循环在某种程度上是N(j * j)的平方根,也是N ^ 3(N * N * N)的平方根。那怎么变成N ^ 2?
答案 0 :(得分:1)
回答这个问题有两个部分。首先,让我们讨论如何确定程序的运行时间将是多个循环。我们关心的是sum ++语句的调用次数 - 这就是我们正在测量的内容。考虑一下这个程序:
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
sum++;
首先我们看一下外循环,我们看到它会运行N次。现在,我们看一下内部循环,我们想知道外循环的每次迭代将运行多少次。一旦我们知道了,我们就可以简单地将这两个值相乘,并获得调用sum ++的总次数。在这种情况下,很容易看出每次运行外循环时,内循环将运行N次。由于外循环也运行N次,因此其运行时间为N ^ 2.
正如您所指出的,外部循环确实将以sqrt(N)次运行。现在,我们必须看看内循环将为外循环的每次迭代运行多少次。我们可以通过简化每个循环中的计数器来实现。通过这样做,我们可以看到每次调用外部循环时内部循环将运行N ^(3/2)次。
为什么这是真的?那么,请注意你写的内容相当于
for (int i = 0; i < N^(1/2); i++)
for (int j = 0; j < (N*N*N)^(1/2); j++)
sum++;
因为对于外循环的每次迭代,我们运行内循环N ^(3/2)次,我们可以简单地将它们相乘以获得总的运行时间O(N ^ 2)。