O(n)中的Eratosthenes之筛。

问题描述 投票:-1回答:1

我最近看到一篇文章,声称可以用高效的Sieve Of Eratosthenes在O(n)内找到所有小于n的质数。然而我无法看出它是如何做到O(n)的。

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

谁能帮帮我?

primes sieve
1个回答
3
投票

一般的Sieve Of Eratosthenes是O(n 原木 n).

Paul Pritchard曾做过一些类似于Eratosthenes筛子的工作,这些筛子运行在O(n),甚至在O(n 原木 n). 它们的实现很棘手,尽管理论上的时间复杂度有所提高,但运行筛子所涉及的记账使它们比普通的埃拉托斯特尼斯之筛慢。

我讨论了一个简单版本的Pritchard的筛子在 我的博客.


1
投票

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

(外部链接) 具有线性时间复杂度的埃拉托斯特尼之筛.

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

(外部链接) 线性初数筛。A Family Tree (1987年,PDF).

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

GfG的版本使用了很多额外的内存。 CP的版本用的少一点。 两者都是 巨大 与典型的字节或位实现的SoE相比。 在10^9的情况下,它比简单的位数组单片SoE多用了60多倍的内存,而且速度也只有一半,即使使用uint32_t类型。

所以在实际应用中,它比简单的4行单片SoE要慢,这也是我们通常在 开始 在进入有趣的优化之前(分段筛、轮子等)。 如果你真的想要因子数组,那么这很有用。 这对学习和实验也很有用,虽然GfG的文章除了给出代码之外,实际上并没有做太多的事情。 CP页面确实介绍了一些历史和一些记忆速度分析。

© www.soinside.com 2019 - 2024. All rights reserved.