对于python中的for循环:
for(int a = 1 ; a < N ; a*=2)
for(int b =1 ; b <N ; b++)
我知道代码在O(n*log(n))
中完成,但如果循环是:
For(int a = 1 ; a <N ; a*=2)
for(int b = 1 ; b < a ; b++)
它还会在O(n*log(n))
完成吗?
答案 0 :(得分:0)
是(不)。严格按照Big O的定义,我们将在下面看到第二个算法是O(n*log(n))
,但有更好的约束。
首先,让我们回顾第一个循环的想法。如果我们将每个循环迭代称为一个计算单位,我们可以说计算的总量是sum(sum(1 from 0 to N) from 0 to log2(N))
,它只是N log2(N)
(可能是一个)。此结果显示第一组循环为O(N log(N))
。
现在是第二盘。重复上述步骤,我们得到sum(sum(1 from 0 to *a*) from 0 to log2(N)) = (log2(2 N) log2(4 N)) <= k [log(N)]^2
,因此第二个算法为O(log^2(N))
(称为 polylogarithmic )。
请注意,k N log(N)
(对于某些k)仍然是第二个算法的上限,因此严格来说它仍然是O(N log(N)
。
以下是运行时预期增长的图像:
红色是第一组循环,绿色是第二组循环,蓝色是2N log(N)
。