优化Javascript代码以查找素数

时间:2017-01-08 20:27:07

标签: javascript algorithm performance

我正在尝试进行codewars.com挑战,而且我在使代码更高效方面遇到了一些问题。挑战的说明是找到范围内的所有素数,然后我必须找到两个素数,它们之间有一个指定的间隙。

我编写了一个有效的算法,但需要很长时间才能完成所有测试用例。您可以看到以下代码:

function gap(g, m, n) {
// your code

var stopNumber;
var checkIfInteger;
var primeNumbersInRange = [];
var arrayIndex = 0;
var gap;

//iterate through all of the numbers in the range and find if they're prime
for( var numberToCheck  = m; numberToCheck <= n; numberToCheck++){

      var checkedTwoAndThreePass = true;

      checkIfInteger = numberToCheck / 2;

      if(Number.isInteger(checkIfInteger)){
        checkedTwoAndThreePass = false;
      }

      checkIfInteger = numberToCheck / 3;

      if(Number.isInteger(checkIfInteger)){
        checkedTwoAndThreePass = false;
      }

      if(checkedTwoAndThreePass){

        var k = 1;
        var primeNumberCheck = true;

        stopNumber = Math.sqrt(numberToCheck);

        while( ((6 * k) - 1) <= stopNumber & primeNumberCheck === true ){

          checkIfInteger = numberToCheck / ((6 * k) - 1);

          if(Number.isInteger(checkIfInteger)){
            primeNumberCheck = false;
          }      
          else{

            checkIfInteger = numberToCheck / ((6 * k) + 1);

            if(Number.isInteger(checkIfInteger)){
              primeNumberCheck = false;
            }
          }
          k++;
        }

        if(primeNumberCheck === true){
          primeNumbersInRange[arrayIndex] = numberToCheck;
          arrayIndex++;
        }

      }  

}

for(var i = 0; i < primeNumbersInRange.length; i++){
  gap = primeNumbersInRange[(i+1)] - primeNumbersInRange[i];
  if(gap === g){
    var primeNumbersThatMeetGap = [primeNumbersInRange[i], primeNumbersInRange[(i+1)]];
    return primeNumbersThatMeetGap;
  }
} 
var primeNumbersThatMeetGap = null;
return primeNumbersThatMeetGap;
}

2 个答案:

答案 0 :(得分:0)

一种可能的方法是实施Sieve of Eratosthenes算法。 Example implementation here

但仅此一点还不够。您需要一直找到不重复的方法,或者仅针对问题搜索所需

答案 1 :(得分:0)

我已经通过使用Sieve of Sundaram来实现这项工作,in this answer通常被认为比Eratosthenes的Sieve慢,但经过一点优化后,它的速度比最快的Sieve快了约2倍Eratosthenes在该问题下实施。在前1M个数字中找到78498个素数的时间不到25ms。

您可以看到它正常工作Project Structure

目前我正在研究这种算法的分段版本,它会产生;

  1. 对单核10 ^ 9的订单反应要快得多。
  2. 通过使用工作人员在可用的免费线程上产生更大的工作。
  3. 一旦我完成了代码,我将根据我在该主题中的现有答案将其作为补充。