簡體   English   中英

優化Javascript代碼以查找素數

[英]Optimizing Javascript code for finding prime numbers

我正在嘗試一個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;
}

一種可能的方法是實現Eratosthenes算法的篩選 示例實現在這里

但是,僅憑這一點還不夠。 您將需要找到一種方法, 而不是一直重復自己,或者搜索問題所需的內容。

我已經通過利用通常被認為比Eratosthenes篩子慢的Sundaram篩子實現了這項工作,但是經過一點優化,結果卻比在此下實施的最快的Eratosthenes篩子快約2倍。題。 在頭100萬個數字中找到78498個質數花費的時間不到25毫秒。

您可以在此答案中看到它正在工作。

目前,我正在研究該算法的分段版本,該版本將產生結果。

  1. 單核的響應速度更快,約為10 ^ 9。
  2. 通過使用工人在可用的空閑線程上產生更大的工作。

確定代碼后,我將在該主題下現有的答案下將其作為補充。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM