此代码的时间复杂度高

英国

给出以下代码-:

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

我知道外循环运行N时间,而内循环运行大约log(N)时间。这是因为在每次迭代ij运行ceil(N)ceil(N/2)ceil(N/4)时间等。这只是一个粗略的计算,通过它我们可以猜测时间复杂度肯定会达到O(N log(N))

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

我知道,对于迭代,增量为ithjceil(N/2(i - 1))

瓦特姆

每个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)

在此处输入图片说明

该总和是谐波序列,其值近似等于ln(n) + C总迭代次数,n ln(n)并且由于所有对数均与常数相关,因此迭代次数将为O(nlogn)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章