【问题标题】:is Sieve of erathosthens the best algorithm to generate prime numbers from 1 to N?埃拉托色尼筛法是生成从 1 到 N 的素数的最佳算法吗?
【发布时间】:2011-03-16 17:20:02
【问题描述】:

我在一次采访中被问到这个问题。 我使用 Eratosthenes 筛概念和一个数组实现了一个算法。

有没有更好的方法来解决这个问题 对于那些不知道筛子的人,这里是链接:

http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes

编辑:就时间和空间复杂性而言最好。 我刚刚告诉他们 SoE 的缺陷是空间复杂性。 所以他们问我能不能做点什么。 以下是采访的过程: 1) 实现一个打印从 1 到 n 的素数的算法 Ans:我使用 SoE 实现 2)这是最好的方法吗 答:???

【问题讨论】:

  • 如果被问到这个问题,我可能会退出面试。谜题表明他们正在寻找有智慧的人。像这样的问题只是意味着面试官很傲慢。
  • 等等...他们是问你是否有比埃拉托色尼筛更好的东西,还是他们只是问质数?后者很好,如果是这样的话,筛子是一个很好的答案。如果他们问前者,那他们只是傲慢。
  • @Stargazer712:说真的,如果他们问你你的解决方案是否最好,你会退出面试吗?为什么不直接回答问题?例如,说“有更快的筛子,但这是我能从记忆中编码的最好的”。或者说,“我不知道,但我不是数论家”。我不认为想知道候选人是否可以聪明地讨论他们的算法选择是傲慢的。
  • @Steve Jessop,这取决于问题。当我第一次阅读这个问题时,我假设他们说,“这是埃拉托色尼筛子。你能改进它吗?”这个问题太自大了,因为它需要大量可笑的知识,而你不禁希望人们无法凭记忆回答。正如我在第二条评论中所说,如果他们问,“写一个算法来找出所有质数到 N”,然后接着说,“你能做得更好吗?”那么就可以了。
  • @Stargazer712:好的,我明白了,我误解了你的第二条评论,意思是他们不应该问是否有比 SoE 更好的东西。我可能会说,“给我 Google 和半天时间,我可能可以给你一个稍微有问题的阿特金筛子”,只是为了炫耀我实际上听说过它:-) 或者我可能会看看他们的 Eratosthenes 实现,看看他们是否遗漏了任何明显的调整。但你是对的,如果他们希望某人在面试中凭记忆产生阿特金的塞夫,那么要么这是一个非常专业的角色,要么他们有很长的搜索......

标签: algorithm primes sieve-of-eratosthenes


【解决方案1】:

嗯,这取决于您所说的“最佳”是什么意思。埃拉托色尼筛法很容易实现,但Sieve of Atkin 会给您带来更好的性能。

因此,如果“最佳”意味着易于实施和理解,那么 Eratosthenes 就是最佳选择。如果“最佳”意味着想要炫耀您作为数学家的技能或拥有非常快速的算法,那么 Atkin 就是您的最佳选择。

【讨论】:

  • 无论如何优化了阿特金。绝对不是维基百科的变体。
  • @IVlad,根据讨论,即使 Atkin and Bernstein's "primegen"(或进一步优化)中优化的阿特金筛(SoA)也无法击败 "primesieve" 中优化的埃拉托色尼筛(SoE)在my answer here。简而言之,Atkin 和 Bernstein 的比较研究将 SoE 限制在与 SoA 固有的相同水平的车轮分解中,这对于 SoE 来说是不可能的;此外,在比较中,他们使用 SoE 的 4 KB 和 SoA 的 8 KB 的页面缓冲区大小“作弊”。
【解决方案2】:

嗯,它只取决于 N 的值:

  • Eratosthenes 的筛子(Simple Sieve)是当 n 小于 1000 万(意味着 10^7)时找到所有小于 n 的素数的最有效算法之一,因为 Simple sieve 需要 O(n) 线性空间。我们知道我们可以创建一个最大大小为 10^7 的全局数组。因此,当 n 大于 10^7 时,Simple Sieve 面临问题,因为大小超过 10^7 的数组可能不适合内存。

  • 对于 n>=10^7 ,我们可以使用 Eratosthenes 的分段筛,因为在分段筛中,我们可以将内存消耗从线性提高到 O(√n) 空格。

请注意,分段筛的时间复杂度与简单筛相同。分段筛的唯一优势:它非常适合大“n”

【讨论】:

    【解决方案3】:

    对于编程面试,没有:)。虽然http://en.wikipedia.org/wiki/Sieve_of_Atkin 有这个,我敢肯定那里可能有研究论文可以进行小的优化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-05
      相关资源
      最近更新 更多