我遇到了Eratosthenes筛的分段实现,它承诺运行速度比传统版本快很多倍。 有人可以解释如何细分改善运行时间? 请注意,我想查找[1,b]中的素数。分割如何提高Eratosthenes筛的运行时间?
它适用于这样的观念:(寻找素数,直到10^9)
我们首先生成这是需要跨断倍数低于开方筛分素数(10^9) 。然后我们开始交叉第一个素数2的倍数,直到我们达到2> = segment_size的倍数,如果发生这种情况,我们使用(multiple-segment_size)计算下一个分段中该倍数的索引并将其存储在单独的数组(下一个[])。然后,我们使用相同的程序将下一个筛选素数的倍数分离。一旦我们将第一个区段中所有筛分素数的倍数交叉,我们遍历筛选数组并打印(或计数)素数。
为了筛选下一个段,我们重置筛数组,并且通过segment_size递增较低的偏移量。然后我们再次启动渡客的倍数,每个筛分总理,我们从下一个数组检索筛指标,我们开始穿越过倍数从那里...
重点是每次筛选一个段(例如32k),而不是所有的数字。这对缓存效果更好。 – 2014-10-05 10:10:14