这个双循环的时间复杂度

Time Complexity of this double loop

本文关键字:时间复杂度 双循环      更新时间:2023-10-16

这段代码的时间复杂度是多少?

 for(int i = 1 ; i <= b ; ++i )
     for(int j = i ; j <= b ; j += i )

你可以像这样展开循环:

i = 1 ——>   1,2,3,…,b     b
i = 2 ——>   1,3,5,…,b     (b/2)
i = 3 ——>   1,4,7,…,b     (b/3)
i = 4 ——>   1,5,9,…,b     (b/4)
  …
i = b ——>   1, b          (b/b = 1)

展开为如下形式的和:

b + b/2 + b/3 + … + b/b = b * (1 + 1/2 + 1/3 + … + 1/b)

你可能会认出第二个因子是谐波级数。然后,使用以下SO答案的结果:找到谐波级数的大O,你可以得到嵌套循环的大Oh:

O(b * log(b))