public void f7(int N) {
for (int i = N / 2; i > 0; i--) {
if (i % 2 == 0) {
for (int j = 0; j < N; j += 2) {
System.out.println("Hey");
}
} else {
for (int j = 1; j < N; j *= 2) {
System.out.println("You");
}
}
}
}
所以我试图找到这个特定代码块的渐近复杂度(Big O)。
我的想法:第一个for循环是O(N),并且因为一半时间数字将是奇数而另一半时间它将是偶数,它仍然是O(N)for for循环里面由于j * = 2,if语句和for语句中的for循环的O(Log N)因此对于我的最终答案我得到了O(N ^ 2(Log N)),但显然答案只是O(N ^ 2)。我想知道是否有人可以解释我的想法在哪里出错?谢谢!
答案 0 :(得分:5)
内循环的yield
运行时间仅适用于O(Log N)
的奇数值(它们是i
的可能值的一半)。对于i
的偶数值,内循环的运行时间为i
,因为O(N)
在每次迭代中递增2。
所以你拥有的是
j
是O(N 2 ),因为第一项(渐近是增长较快的项)是N 2 / 8,其渐近为O(N 2 )。
答案 1 :(得分:4)
是O(N 2 )。原因是当我是偶数时,j循环是O(N),并且发生O(N)次; N * N是N 2 。
重要的是j增加2; O(N / 2)== O(N)。
同样重要的是,当我奇怪的是,j循环是O(log N) - 这只是在较慢的循环上变成噪声。