[英]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毫秒。
您可以在此答案中看到它正在工作。
目前,我正在研究該算法的分段版本,該版本將產生結果。
確定代碼后,我將在該主題下現有的答案下將其作為補充。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.