【发布时间】:2019-12-20 20:20:26
【问题描述】:
我一直在应对编码挑战。说明如下:
“创建一个无穷无尽的素数流 - 有点像 IntStream.of(2,3,5,7,11,13,17),但是是无限的(嗯,long )。 流必须能够在几秒钟内产生 2500 万个素数"
我的代码生成素数但不够快;它一直超时。我希望有人能给我一些关于如何优化我的解决方案或找到更好的解决方案的指导。我的代码如下。这是我一段时间以来第一次在这里发帖,所以如果我需要做任何不同的事情或需要澄清,请告诉我。谢谢。
class Primes {
static * stream() {
yield 2;
let n = 3;
while (n < 15486042) {
if (isPrime(n)) {yield n}
n += 2;
}
}
}
function isPrime(n) {
for (let a = 3; a <= ~~Math.sqrt(n); a+=2) {
if (n%a == 0) return false;
}
return true;
}
【问题讨论】:
-
使用埃拉托色尼筛。如有必要,请分块使用。如果这还不够快,那么试试阿特金筛子,它会稍微快一点。
-
您通过检查每个可能的除数通过平方根来测试每个数字的素数。如果您可以存储先前的素数,则只需测试直到平方根的素数除数(基本上是埃拉托色尼筛)。
-
@rossum - 谢谢,我已经考虑尝试使用阿特金筛。它似乎更复杂,但也许这是要走的路。
-
@lurker - 感谢您指出这一点。我将此解决方案基于 Eratosthenes 筛,尽管我知道这远未达到理想的优化。因此,为了优化,我应该将素数数组传递给 isPrime(n) 函数并将其用作评估的跳跃点?再次感谢您。
-
@WillNess 我明白了。这绝对不是我的本意。这就是这些简洁的小cmets的问题。 :p
标签: node.js optimization primes