打印了几颗星星?

时间:2018-08-18 09:44:36

标签: algorithm big-o

for(int i = 0; i < N; i = i+1)
    for(int j = i; j > 0; j = j/2)
        StdOut.print("*");

以下是可能的答案:
A)O(log N),
B)O(N),
C)O(N log N),
D)O(N ^ 2)

我知道答案是C),但我们对此感到困惑。

1 个答案:

答案 0 :(得分:1)

ABCD都不能回答“打印多少颗星星?”这个问题。因为它们实际上都不是数字。但是,如果您的 actual 问题是“此代码的繁琐印刷内容是什么?”,则只需检查两个循环即可:-)

外部循环运行N次,因此比较容易。是N

内部循环从j开始i(在所有外部循环中平均约为N / 2),并在每次迭代中将其减半。因此,如果i1024,那将是大约十次迭代。如果512约为9,256约为8,依此类推。

这显然是对数情况,其中内循环运行与log2N相关的次数。

而且,由于您在另一个循环中运行一个循环,因此您将各个复杂度乘以即可得到O(N log N)(在复杂度分析中我们并没有真正使用对数为底)。