Javascript 为什么这些筛选优化破坏了我的代码?

Javascript 为什么这些筛选优化破坏了我的代码?,javascript,primes,sieve-of-eratosthenes,sieve,Javascript,Primes,Sieve Of Eratosthenes,Sieve,我怎样才能纠正它们以使其发挥作用? 我正试图根据之前的建议优化我的筛选,但在这两种情况下,代码都会中断: 递增j=j+(i*2)将中断代码 很明显,我和其他人一样缺少一些关于优化的概念。 但一般来说,你只需要通过,把一个素数的所有倍数标记为非素数。 优化是下一步 //prime-3 //筛选实现 函数素数3(n){ 常数筛=(新数组(n)).fill(真); //仅迭代到平方根n进行标记 对于(假设i=2;i*i实际上,优化对我有效: //prime-3 //筛选实现 函数素数3(n){ 常

我怎样才能纠正它们以使其发挥作用? 我正试图根据之前的建议优化我的筛选,但在这两种情况下,代码都会中断:

递增
j=j+(i*2)
将中断代码

很明显,我和其他人一样缺少一些关于优化的概念。 但一般来说,你只需要通过,把一个素数的所有倍数标记为非素数。 优化是下一步

//prime-3
//筛选实现
函数素数3(n){
常数筛=(新数组(n)).fill(真);
//仅迭代到平方根n进行标记

对于(假设i=2;i*i实际上,优化对我有效:

//prime-3
//筛选实现
函数素数3(n){
常数筛=(新数组(n)).fill(真);
//仅迭代到平方根n进行标记

对于(让i=2;i*i您的优化需要在首先去掉偶数之后应用(除了2)。 因为当
i==2
时,通过增加
i*2
可以有效地跳过所有偶数

以下是工作代码:

//prime-3
//筛选实现
函数素数3(n){
设sieve=(新数组(n)).fill(true);
对于(设i=4;i对于(假设i=2;i*i你犯了一个简单的错误,没有准备好你的筛子。首先,你应该消除所有2的倍数:

function makeSieve(n){
  const sieve = new Array(n).fill(true);
  for(let i = 2; i < sieve.length; i += 2){
    sieve[i] = false;
  }
}
将成为

3, 9, 15, 21

创建一个包含所有真值的数组,然后标记所有even似乎效率低下。希望有一种方法可以在标记所有even的情况下初始化数组。循环仅为O(n)。量级小于总体复杂度,即O(nlog(log(n)))为什么你要把4,6,8,10的倍数标记为复合倍数?它们不是已经标记为2的复合倍数吗?为什么你要检查2以上的偶数是否为素数?你难道不知道它们不是吗?为什么你要把2标记为复合倍数,然后标记为素数,然后检查它是否为素数?你难道不知道2是p吗雾凇?在问题中,它们没有被标记为复合,因为增加了
i*2
,最小的
i
2
。最后一个原因是有效的。我更新了我的答案。还编辑了我的答案,添加了一个标准的简单筛选“对于特殊情况2,从3开始,将候选项增加2,并使用内部循环增量
2*i
,而不仅仅是
i
”——前提是从3开始,将候选项增加2,即:)也就是说,优化是按照特定的顺序进行的,你不能跳过一个而使用另一个,这实际上取决于第一个!谢谢,注意到。我还需要一步一步地浏览代码,看看它在做什么,而且比它更明显。创建一个标有evens的筛子是
O(n)
time complexity你能解释一下大O时间复杂度吗?关于大O时间复杂度,请参见另一个问题中的最后一句。它提供了链接。
π(n)*π(√n) 
这意味着:测试
n
下的每个素数是否被
sqrt(n)
下的所有素数整除
π(n)
=
n/log n
(详情请参见此处的链接).至于复合材料,请参见另一个链接。总体复杂度是这两个链接中的最大值。如果您在浏览这些链接后有一些具体问题,请在那里提问。:)或者您是指埃拉托斯烯的适当筛分的复杂度?关于这一点,请参见例如…(上述评论指的是最佳试验划分筛分)。
3, 6, 9, 12, 15, 18, 21
3, 9, 15, 21