【问题标题】:Optimizing Javascript code for finding prime numbers优化 Javascript 代码以查找素数
【发布时间】:2017-05-23 02:14:23
【问题描述】:

我正在尝试 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;
}

【问题讨论】:

  • 这个问题的约束是什么(范围的界限可以有多大)?
  • 一个基本的en.wikipedia.org/wiki/Sieve_of_Eratosthenes 可以避免许多重复检查。由于需要找到“所有”素数..
  • 你能决定缩进风格并相应地清理你的代码吗?此外,您有一个&amp;,您可能想要一个&amp;&amp;。检查 jshint.com 上的代码并修复所有错误。
  • @BrunoLM 是的,就是那个。

标签: javascript algorithm performance


【解决方案1】:

我通过使用Sieve of Sundaram 实现了这项工作,这通常被认为比埃拉托色尼筛网慢,但是经过一些优化后,它比埃拉托色尼筛网的最快实现快了大约 2 倍在该问题下实施。在前 100 万个数字中找到 78498 个素数只用了不到 25 毫秒。

你可以看到它在in this answer工作。

目前我正在研究该算法的分段版本;

  1. 单核 10^9 级的响应速度要快得多。
  2. 使用工作线程在可用的空闲线程上生成更大的作业。

一旦我完成了代码,我将把它作为我对该主题现有答案的补充。

【讨论】:

    【解决方案2】:

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

    但仅此还不够。您将需要找到一种方法,让自己不再重复,或者只搜索需要的内容来解决问题。

    【讨论】:

    • 我确实在这里用我的第一个提示解决了这个问题,但第二个提示让一切变得简单得多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多