【问题标题】:Comparison of Sieve of Sundaram and Sieve of Atkin for generating a list of prime numbersSundaram 筛法和 Atkin 筛法生成素数列表的比较
【发布时间】:2011-03-08 17:14:16
【问题描述】:

根据链接:http://en.wikipedia.org/wiki/Sieve_of_Sundaram,生成最多 n 个素数列表的“sundaram 筛子”的运行时间为 O(n*log(n))。这个算法比“阿特金筛子”更好吗?如果能详细说明一下它是如何工作的?

【问题讨论】:

  • 更好是什么意思?实践上好还是理论上好?
  • 阿特金、埃拉托色尼、桑达拉姆……按这个顺序。
  • @st0le,您能支持将阿特金筛 (SoA) 放在首位吗?我有done research for this answer 说,SoA 仅在非常有限的特定情况下击败了最大优化的车轮分解埃拉托色尼筛 (SoE),如果有的话,也只有很小的差距。 Atkin 和 Bernstein 的研究存在缺陷,他们将参考 SoE 实现限制为仅与 SoA 固有的轮子分解级别相同,并且通过对 SoE 使用 4 KB 的缓冲区大小和对 SoA 使用 8 KB 的缓冲区大小破坏了它们的时序比较。
  • 续:Atkin 筛和 Sundaram 筛的最大问题是高效的多重处理,因为它们有越来越多的序列,直到筛分范围的平方根,需要重新开始以不断增加的计算成本为每个新段页面计算地址。埃拉托色尼筛法的序列比率要低得多,仅基于基素数到范围的平方根,其密度随着范围的增加而降低。这也是为什么 Daniel Bernstein 的“primegen”没有随着范围的增加而显示经验 O(n) 性能的原因。
  • @Gordon:检查source code of primegen 表明,Dan Bernstein 为他的 Atkin 实现提供了一个筛缓冲区,该缓冲区是他用于 Eratosthenes 箔的筛缓冲区的 四倍 ( 2048 * 16 单位与 1001 * 8 单位)。此外,他的实现方法不能与现代内存缓存系统很好地交互。在这个老化的 Lynnfield 上,MinGW 构建的 primespeed 在 0.68 秒内将素数计数到 10^9,eratspeed 需要 0.70(重定向到文件!)。即使在 C# 中,我也可以通过仅赔率的 SoE 击败它,而无需使用 C/C++ 或 mod 30 轮。

标签: c++ algorithm primes


【解决方案1】:

理论上:

  • Sundaram 筛子的算术复杂度为 O(n log n)。
  • Eratosthenes 的基本筛具有算术复杂度 O(n log log n)。
  • 埃拉托色尼筛的优化变体具有 O(n) 的算术复杂度。
  • 阿特金筛不仅算术复杂,而且位复杂度 O(n/log log n)。
  • 按顺序为您提供素数的神奇筛子需要时间 O(n/log n)。

在实践中,Sundaram 的筛子非常慢,以至于没有人使用它,而且 Atkin 的筛子比优化的 Eratosthenes 变体慢(尽管它至少具有竞争力)。也许有一天阿特金或其他东西会取代埃拉托色尼,但这不太可能很快发生。 (而且,没有魔法这样的东西。)

【讨论】:

    【解决方案2】:

    好吧,Sieve of Atkin 的维基百科页面说:

    这个筛子使用 O(N/log log N) 操作计算最多 N 个素数

    这比 Sundaram 筛要好,后者在操作中为 Θ(N log N)(注意这不是 O(N log N)——O() 和 Θ() 之间存在细微差别)。

    【讨论】:

    • f(N) = Theta(N log N) 意味着 f(N) = O(N log N)。反之亦然。
    • @CanSpice,在使用渐近计算复杂度来选择算法时必须小心,因为仍然要问“在什么范围内?”和“给定 N 的速度是多少?”。 Sundaram 筛子的维基百科文章曾经说过,如果使用具有 O(1) 的哈希表实现,它可以具有 O(N);然而,即使这是真的,使用哈希表通常会比不使用哈希表多出 10 倍的持续开销,因此生成的 O(N) 算法肯定不会赶上 O(N Log Log N) 的埃拉托色尼筛法)。
    • 续:将埃拉托色尼筛法 (SoE) 与阿特金筛法 (SoA) 进行比较,相对性能为 O(N log log N)/O(N)和 O(N)/O(N / Log Log N) (每个性能对,每个都具有相同的优化,第二个没有一个实际实现过),因为如果 SoA 具有更高的常数因子开销比 SoE(当两者都被最大限度地优化时),那么在实际范围内,SoA 实际上可能比 SoE 慢。另见this article
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-07
    • 2014-03-14
    • 2011-09-26
    • 1970-01-01
    相关资源
    最近更新 更多