以下代码片段的最坏情况运行时间的增长顺序是N的函数是多少?

时间:2014-09-07 04:34:38

标签: big-o complexity-theory

int sum = 0;
for (int i = 1; i <= N; i = i*2)
    for (int j = 1; j <= N; j = j*2)
        for (int k = 1; k <= j; k++)
            sum++;

根据解决方案,它是NlogN。但是,我认为这只是logN。 i for循环迭代logN次,因为我每次迭代都加倍。 j for循环与i for循环相同,因此它也会迭代logN次。最后,k for循环,因为它被设置为小于或等于j,它将迭代相同的次数j,因此,我们有另一个logN迭代。将三者相乘,我们得到logN * logN * logN总迭代次数或(logN)^ 3的复杂性。为什么我的思维过程不正确?

2 个答案:

答案 0 :(得分:3)

sum++;

显然是O(1)

for (int k = 1; k <= j; k++)
    sum++;

循环运行j次,因此O(j)

for (int j = 1; j <= N; j = j*2)
    for (int k = 1; k <= j; k++)
        sum++;

所以这很棘手。我们知道内循环是O(j),但j正在外循环中发生变化。你说:

  

最后,k for循环,因为它被设置为小于或等于j,它将迭代相同的次数j

没有。 j循环按双精度计算。但内循环按增量计算。它们不会进行相同数量的迭代。

由于每个内循环都在O(j)时间运行,我们只需要在循环中每次都求和j。每次j加倍,以便给我们:

1 + 2 + 4 + 8 + 16 + ... + n

此序列最终略低于2n。 (为什么留给读者作为一个例外。)因此它的O(n)

for (int i = 1; i <= N; i = i*2)
    for (int j = 1; j <= N; j = j*2)
        for (int k = 1; k <= j; k++)
            sum++;

外部循环不与内部循环交互,并且运行log(N)次给我们O(N log N)

答案 1 :(得分:0)

使用Sigma表示法,您可能会有条不紊地得到确切的公式:

enter image description here