我有大学的伪代码:
(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
我认为我的方面存在一种误解,因为Big O应该是O(n ^ 2),但是根据我的理解它是O(2n ^ 2)。
请你们帮我弄清楚,我的误解是什么。感谢
答案 0 :(得分:0)
你的误解是认为2n ^ 2不是O(n ^ 2)。 Big-O忽略缩放常量,因此你可以忽略前面的2。
答案 1 :(得分:0)
其实你已经得到了正确答案!
那是因为O(2 *n²)等于O(n²)。常数乘数不会影响Big-O。有关其背后的数学的更多信息,我建议阅读有关渐近分析的数据。为了简单起见,它与n趋于无穷大时有关。
答案 2 :(得分:0)
计算内环是错误的:
当外环(i)从2变为n时,内环将迭代不超过0 + 1 + 2 + ... + n-2次,这相当于第一个n-2自然的总和号。
前n个自然数之和的公式为n *(n + 1)/ 2。
由于存在-2偏移,内环的最大迭代次数将为(n-2)*(n-1)/ 2.