嵌套for循环的大o表示法

时间:2015-10-06 18:33:39

标签: java big-o

如何找到以下代码的嵌套for循环的重要符号?

int sum = 0;
for(int i = 1; i < N; i *= 2)
   for(int j =0; j <i; j++)
     sum++;

我相信外部循环是log(n),内部循环是N,所以不是答案n * log(n)?如果我的答案是正确的,我们可以假设j

2 个答案:

答案 0 :(得分:4)

如果内循环从零到N,你的答案是正确的。但是,它从零运行到i,而sum++依次以2的连续幂运行。

因此,内部块1+2+4+8+16+... 执行的次数可以计算为形式的总和

[Error]: Network connection failed. Making attempt 2 after sleeping for 3.492912 seconds.
[Error]: A server with the specified hostname could not be found. 
(Code: 100, Version: 1.8.1)

使用log 2 N个术语。

这是一个几何系列。计算s um of its first log2N terms给出的正确答案是O(N)。

答案 1 :(得分:0)

即使你不能用数学方法找到答案,经验证据怎么样?

for (int N = 1; N > 0; N <<= 1) {
    int sum = 0;
    for (int i = 1; i < N; i *= 2)
        for (int j = 0; j < i; j++)
            sum++;
    System.out.println(N + ": " + sum);
}

输出

1: 0
2: 1
4: 3
8: 7
16: 15
32: 31
64: 63
128: 127
256: 255
512: 511
1024: 1023
2048: 2047
4096: 4095
8192: 8191
16384: 16383
32768: 32767
65536: 65535
131072: 131071
262144: 262143
524288: 524287
1048576: 1048575
2097152: 2097151
4194304: 4194303
8388608: 8388607
16777216: 16777215
33554432: 33554431
67108864: 67108863
134217728: 134217727
268435456: 268435455
536870912: 536870911
1073741824: 1073741823

当你加倍N时,你执行sum++的次数增加一倍,所以答案是: O(N)