【发布时间】:2020-06-23 12:57:00
【问题描述】:
我该如何纠正它们以使其正常工作? 我正在尝试根据之前的建议优化我的筛子,但在这两种情况下,代码都会中断:
递增j = j + ( i * 2) 会破坏代码。
显然我和其他人一样缺少一些关于优化的概念。 但总的来说,您只需将素数的所有倍数标记为非素数即可。 下一步是优化。
// prime-3
// sieve implementation
function prime3(n) {
const sieve = (new Array(n)).fill(true);
// Only iterate up to the square root n for marking
for (let i = 2; i * i <= n; i += 1) {
if (sieve[i]) {
// recommended optimization breaks the code
// j = j + ( i * 2 )
for (let j = i * i; j <= n; j = j + i) {
sieve[j] = false;
}
}
}
return makePrimes(sieve, n);
};
function makePrimes(sieve, n) {
let primes = [];
for (let i = 2; i < n; i++) {
if (sieve[i]) {
primes.push(i);
}
}
return primes;
}
console.log(prime3(100));
【问题讨论】:
-
recommendation was" 到特殊情况 2,从 3 开始 和 将候选者加 2 并使用 @ 的内部循环增量987654326@ 而不仅仅是
i" -- 提供 你从 3 开始并将候选者增加 2,也就是说。 :) 即优化是按特定顺序进行的,您不能跳过一个并使用另一个确实取决于第一个! -
谢谢,注意到了。我还需要单步执行代码以查看它在做什么,而且比它更明显。创建一个带有标记的筛子是
O(n)时间复杂度你能解释一下所有的大 O 吗? -
是大 O 时间复杂度,请参阅my answer 中的最后一句话来回答您的其他问题。它提供链接。
π(n)* π(√n)表示:n下的每个素数都经过sqrt(n)下所有素数的整除性测试。π(n)=~n/log n(详见链接)。至于复合材料,请参见其他链接。整体复杂度是两者中的最大值。如果您在处理完这些链接后会有一些具体问题,请在那里问他们。 :) -
或者您的意思是埃拉托色尼筛网的复杂性?为此,请参见例如stackoverflow.com/a/2582776/849891。 (以上评论指的是最优试划分筛)。
标签: javascript primes sieve-of-eratosthenes sieve