内循环的时间复杂度

Time complexity of the inner loop

谁能帮我计算一下内循环的时间复杂度?据我了解,外部的将是 O(n)。但是我不知道如何计算第二个里面发生的事情。

for (int i = 2; i < n; i++) {
    for (int j = 2; i * j < n; j++) {
}

内部循环 运行s 从 2 到但不包括 n/i 次。您可以将其表示为 n/i - 2.

如果我们 运行 内部循环 n - 2 次(因为这是外部循环的次数 运行s),我们得到以下总和:

(n/2 - 2) + (n/3 - 2) + ... + (3 - 2)

我有一种预感,但不记得这个系列总和为 log_e(n) * n 或类似值的 100%。所以在时间复杂度上,这就变成了O(log n * n).

对于“外循环”的每次迭代,内循环运行 n/i

因此,总复杂度为:

n/2 + n/3 + n/4 + ...
= n * (1/2 + 1/3 + 1/4 ...)

对于上面的右项,上限是ln(n)

因此,此代码的复杂度为 O(n log n)

一旦 i * j ≥ n,即当 j = ceiling(n / i) ~ n / i 时,循环退出。从j=2开始,迭代次数为ceiling(n / i) - 1.