我正在练习算法的复杂性,我在网上看到了这个代码,但我无法弄清楚它的增长顺序。有什么想法吗?
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++;
答案 0 :(得分:2)
一次一步(或在这种情况下循环):
第一个循环会增加i
,只要其平方低于N
,因此必须为O(sqrt N)
,因为int(sqrt(N))
或int(sqrt(N)) - 1
是最大的整数值,其平方值低于N
;
第二个循环也是如此。我们可以忽略4
,因为它是一个常数,我们在处理大符号时并不关心它们。所以前两个循环是O(sqrt N)*O(sqrt N) = O(sqrt(N)^2) = O(N)
。您可以将复杂性相乘,因为循环是嵌套的,因此第二个循环将完全执行第一个循环的每次迭代;
第三个循环显然是O(N^2)
,因为k
上升到N
的平方。
所以整件事必须是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
第三个循环是直截了当的。