【问题标题】:Sieve Of Eratosthenes in O(n)O(n) 中的 Eratosthenes 筛
【发布时间】:2020-06-01 18:13:06
【问题描述】:

我最近看到一篇文章声称它可以使用有效的埃拉托色尼筛法找到 O(n) 中小于 n 的所有素数。但是我无法看到它是 O(n)。

https://www.geeksforgeeks.org/sieve-eratosthenes-0n-time-complexity/

有人可以帮忙吗?

【问题讨论】:

  • 我们不会去其他网站获取您的问题所需的信息。所有相关细节都需要在问题本身中出现,以便将来的读者可以使用,以防将来链接失效。您可以使用该链接作为附加参考,但所有相关信息都需要在此处发布。有关详细信息,请参阅help center
  • 如果它比 O(n log log n) 更好,那么它不是 Eratosthenes 的筛子。如果它的规模没有超过某个(按照现代标准相当低的)上限,那么它的声明就不会真正渐近成立。
  • 但我没有任何权利从该站点重新发布代码。

标签: primes sieve


【解决方案1】:

Eratosthenes 的正常筛子是 O(n log log n)。

Paul Pritchard 在 O(n) 甚至 O(n / log log 中运行的类似于 Eratosthenes 的筛子上做了一些工作n)。它们实施起来很棘手,尽管理论上的时间复杂度有所提高,但运行筛子所涉及的簿记使它们比普通的 Eratosthenes 筛子慢。

我在my blog 讨论一个简单版本的 Pritchard 筛子。

【讨论】:

    【解决方案2】:

    它是 Gries 和 Misra (1978) 筛的一个版本,它是一个 O(n) 筛。可以在这里找到更好的描述:

    (外部链接)Sieve of Eratosthenes Having Linear Time Complexity.

    有关该领域专家对此类筛子的更多理论研究,请参阅 Pritchard 的论文:

    (外部链接)Linear Prime-Number Sieves: A Family Tree (1987, PDF).

    Pritchard 以其亚线性筛算法和论文以及其他早期贡献而闻名。

    GfG 的版本使用了大量的额外内存。 CP 的版本使用较少。与 SoE 的典型字节或位实现相比,两者都巨大。在 10^9 时,它使用的内存比简单的位阵列单片 SoE 多 60 倍以上,速度也减半,即使使用 uint32_t 类型也是如此。

    因此在实践中它比简单的 4 行单片 SoE 慢,这通常是我们在进入有趣的优化(分段筛子、轮子等)之前开始的地方。如果你真的想要因子数组,那么这很有用。它对学习和实验也很有用,尽管 GfG 文章实际上除了提供代码之外并没有做太多事情。 CP 页面确实回顾了一些历史记录和一些内存/速度分析。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-05
      • 2019-07-03
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      相关资源
      最近更新 更多