特定双循环的大O

时间:2016-05-03 06:30:37

标签: java nested big-o

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)。我想知道是否有人可以解释我的想法在哪里出错?谢谢!

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) - 这只是在较慢的循环上变成噪声。