如何找到以下代码的嵌套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
答案 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)