go中有一个更好的并发素数筛子

时间:2011-02-06 15:31:13

标签: algorithm go

看完素数筛码后,看看怎么样了 并发结构工作,我发现它非常优雅。 然而,它也是非常低效的,IIRC,相当于 O(n ^ 2)运算测试数m的可分性 除以每个小于m的数字。我认为我可以改为 修改它以使用检查可分性的O(n ^ 1.5)操作 m除以每个小于或等于sqrt(m)的数。 然而,事实证明这比我预期的要困难得多。

我知道这更像是一个算法问题,但它也是一个问题 与并发性极为相关。如何实现 O(n ^ 1.5)版本的算法?

3 个答案:

答案 0 :(得分:3)

要查看的地方是stackoverflow,例如问题Concurrent Prime Generator。答案中有一个使用Go and channels

答案 1 :(得分:1)

功能编程社区已经熟知优雅但低效的主筛实现。 Melissa O'Neill的这个paper给出了懒惰的“流”主要筛子的良好概述,并提供了有效的替代品。 (它使用Haskell,但无论如何应该是一个很好的阅读)

答案 2 :(得分:1)

Eratosthenes的筛子在迭代i中识别素数p_i并且在连续迭代中从所考虑的p_i的所有倍数中修剪。鉴于此,您可以在这里进行并行化的唯一方法就是修剪操作。这只能通过一个常数因子来加速,所以你不会用这种方式改变算法的大O.