【问题标题】:A better concurrent prime number sieve in gogo 中更好的并发素数筛
【发布时间】:2011-02-06 15:31:13
【问题描述】:

查看素数筛码后, 并发结构有效,我发现它非常优雅。 但是,它也非常低效,而且 IIRC 相当于 O(n^2) 操作测试数 m 的整除性 除以每一个小于 m 的数。我想我可以改为 修改它以使用检查整除性的 O(n^1.5) 操作 通过将其除以小于或等于 sqrt(m) 的每个数字来获得 m 的值。 然而,事实证明这比我预期的要困难得多。

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

【问题讨论】:

    标签: algorithm go


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      优雅但低效的素筛实现已为函数式编程社区所熟知。 Melissa O'Neill 的 paper 很好地概述了惰性“流”初筛,并提出了有效的替代方案。 (它使用 Haskell,但无论如何应该是一本好书)

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 一般来说,给定算法的并发实现不是超线性的。充其量,他们只是根据并行工作者的数量成比例地加速算法。一个值得注意的例外是find-like 算法。
        猜你喜欢
        • 2019-05-09
        • 2018-08-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-04
        • 2013-04-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多