【发布时间】:2017-05-18 22:56:09
【问题描述】:
我有一个大学的伪代码:
(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)。
请你们帮我弄清楚我的误解是什么。谢谢
【问题讨论】:
-
stackoverflow.com/questions/487258/… 这是对大 O 的解释。至少可以说,O(2n^2) 不是一个紧密的大 O 界限。
-
这个算法非常接近埃拉托色尼筛法,我不明白你为什么不添加一个额外的行 considerably improve the time complexity。
-
@paddy 这可能是教练的目标。
-
这是伪代码,我必须使用。
标签: c++ algorithm big-o primes