此代码的大O时间复杂度

时间:2014-03-23 04:20:35

标签: big-o time-complexity pseudocode

给出以下代码 - :

  
for(int i = 1; i <= N; i++)
    for(int j = 1; j <= N; j = j+i)
    {
        //Do something
    }

我知道外循环运行N次,内循环运行大约log(N)次。这是因为在i的每次迭代中,j运行ceil(N)ceil(N/2)ceil(N/4)次,依此类推。这只是一个粗略的计算,通过它可以猜测时间复杂度肯定是O(N log(N))

我将如何在数学上证明相同?

我知道,对于ith次迭代,j增加ceil(N/2(i - 1))

1 个答案:

答案 0 :(得分:3)

i的每个值的内循环的迭代总数将是

i = 1: j = 1, 2, 3 ..., n ---> total iterations = n
i = 2: j = 1, 3, 5 ..., n ---> total iterations = n/2 if 2 divides n or one less otherwise
i = 3: j = 1, 4, 7 ..., n ---> total iterations = n/3 if 3 divides n or one less otherwise
...
i = m: j = 1, 1 + m, ... , n ---> total iterations ~ n/m
...
1

所以大约总迭代次数为(n + n/2 + n/3 ... + 1)

enter image description here

该和是Harmonic Series,其值大约为ln(n) + C,因此总迭代大约为n ln(n),并且由于所有对数都与常量相关,因此迭代将为{{1} }。