【问题标题】:Big O for an algorithm for finding prime numbers [duplicate]用于查找素数的算法的大 O [重复]
【发布时间】: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)。

请你们帮我弄清楚我的误解是什么。谢谢

【问题讨论】:

标签: c++ algorithm big-o primes


【解决方案1】:

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

【讨论】:

  • 好的,感谢您的洞察力。现在我只需要知道,运算次数的计算是否正确,这样我就可以继续另一个算法了。
【解决方案2】:

内循环计算错误:

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

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

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

【讨论】:

    【解决方案3】:

    其实你已经得到正确答案了!

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

    【讨论】:

      猜你喜欢
      • 2012-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多