打印了几颗星星? (选择最小的正确估算值。)
for (int i = 0; i < N / 2; i = i + 1) for (int j = 1; j < N / 2; j = 2 * j) StdOut.print("**");
- O(log N)
- O(N)
- O(N log N)
- O(N ^ 2)
我对这个问题有些困惑,我认为是A或D,但不确定。
我知道Big O表示法是如何工作的,但是当您乘以2时,我对内部循环中的增量感到困惑。我认为它是A的原因是由于外部循环是对数(?)但是正如我所说,我不太确定内部循环。预先谢谢你
答案 0 :(得分:4)
外部循环生成N / 2
个迭代。对于此迭代中的每个迭代,内部循环都会上升到N / 2
,但步长为2 * j
。也就是说,您以N / 2
个步骤到达log_2(N / 2)
。
输入数字64
。我们从1
开始,并在每次迭代中乘以2
:
1
2
4
8
16
32
64
我们以64
个步骤到达了6
。而且,实际上64
是2^6
。所以log_2(64)
是6
。
因此,总共有来自外部循环的N / 2
个迭代,每个迭代都产生了内部循环的log_2(N / 2)
个迭代。那使
N / 2 * log_2(N / 2)
总共条打印线的执行。因此,3. O(N log N)
是正确的答案。
而且,由于它是 big-O ,因此该算法也可以在4. O(N^2)
中运行。但是,3. O(N log N)
是最小的正确估计。
答案 1 :(得分:1)
当您乘以2 ...时,我对内部循环中的增量感到更加困惑。
当您从1开始并将变量乘以2
时,您将需要log(N) (base 2)
步才能达到N
。因此,内部循环的复杂度为O(log(N/2)
,相当于O(log(N) - log 2) = O(log(N))
。
我认为它是A的原因是由于外循环是对数的...
另一方面,外部循环是O(N/2) = O(N)
,因为i
在每一步都在增加1
,这需要N/2
直到i
等于N/2
。
由于内部循环不依赖于外部循环,因此在这种情况下,我们可以乘以复杂度,并说整体复杂度为O(N*log(N))
。
因此,正确的选项是c
。