给出以下代码 - :
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))
。
答案 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)
。
该和是Harmonic Series,其值大约为ln(n) + C
,因此总迭代大约为n ln(n)
,并且由于所有对数都与常量相关,因此迭代将为{{1} }。