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),但我们对此感到困惑。
答案 0 :(得分:1)
A
,B
,C
或D
都不能回答“打印多少颗星星?”这个问题。因为它们实际上都不是数字。但是,如果您的 actual 问题是“此代码的繁琐印刷内容是什么?”,则只需检查两个循环即可:-)
外部循环运行N
次,因此比较容易。是N
。
内部循环从j
开始i
(在所有外部循环中平均约为N / 2
),并在每次迭代中将其减半。因此,如果i
是1024
,那将是大约十次迭代。如果512
约为9,256
约为8,依此类推。
这显然是对数情况,其中内循环运行与log2N
相关的次数。
而且,由于您在另一个循环中运行一个循环,因此您将各个复杂度乘以即可得到O(N log N)
(在复杂度分析中我们并没有真正使用对数为底)。