用于寻找素数的算法的大 O

Big O for an algorithm for finding prime numbers

我有一个来自大学的伪代码:

(0) initialize logic array prim[ n ]
(1) prim[ 1 ] = false
(2) for i = 2 to n do
(3)   for k = 2 to i − 1 do
(4)     if i % k == 0 then
(5)       break
(6)     prim[i] = (k == i) // Was loop (3) fully executed?
(7) return prim[]

现在我必须计算这个伪代码的大 O。

我们学会了一步步做,把操作次数加起来。

这是我目前得到的:

比较:

(4): (n-1)(n-2) outer loop * inner loop
(6): (n-1) outer loop

(4) + (6): n^2 - 2 n + 1 operations for all comparisons

作业:

(1): 1
(6): (n - 1)

(1) + (6): n operations for all assignments

部门:

(4): (n-1)(n-2) outer loop * inner loop

n^2 - 3 n + 2 operations for the division.

因此,如果您将这些数字加起来:

(n^2 - 2 n + 1) + n + n^2 - 3 n + 2 = 2n^2 - 4 n + 3

我认为我这边的某个地方存在误解,因为大 O 应该是 O(n^2),但根据我的理解,这里是 O(2n^2)。

你们能帮我弄清楚我的误解是什么吗?谢谢

你的误解是认为 2n^2 不是 O(n^2)。 Big-O 忽略缩放常数,所以你可以忽略前面的 2。

其实你已经答对了!

那是因为 O(2*n²) 等于 O(n²)。常量乘数不影响 Big-O。有关其背后数学原理的更多信息,我建议阅读 Asymptotic Analisys。为了简单起见,它与 n 趋于无穷大的时间有关。

内循环计算错误:

当外循环 (i) 从 2 到 n 时,内循环将迭代不超过 0 + 1 + 2 + ... + n-2 次,等于前 n- 2个自然数。

前n个自然数之和的公式为n*(n+1)/2。

由于偏移量为 -2,因此内循环的最大迭代次数为 (n-2) * (n-1) / 2。