为什么这个for循环需要这么长时间?

时间:2016-02-19 00:33:31

标签: javascript arrays for-loop

我一直致力于项目欧拉问题,在解决问题3时,我遇到了一些奇怪的事情。

问题3要求您“找到数字600851475143的最大素数因子”

我解决了它:

public int[] initArray() {
    return someArray;
}

这花了7534.188ms这实际上是我的第二个版本的程序。

在第一个版本中唯一的区别是isPrime函数中的for循环

var search = 600851475143;
var highest = 0;
var primes = [2,3,5,7,11];

function isPrime(num) {
    for (var i = 0; i < primes.length; i++) {
        if (num === primes[i]) {
            return true;
        }
        else if (num % primes[i] === 0) {
            return false;
        }
    }
    primes.push(num);
    return true;
}


for (var n = 2; n <= Math.floor(Math.sqrt(search)); n++) {
    if (isPrime(n) && search % n === 0) {
        highest = n;
    }
}

console.log(highest);

当此更改到位时,程序耗时72084.540ms

这是从大约8秒增加到大约72秒,这是慢了9倍。

我不相信额外的迭代可以解释这种时间的增加。我最初的想法是,因为它正在寻找一个不存在的索引,但肯定会使程序崩溃,而不仅仅是让它运行得更慢。

有没有人对此有任何见解?

2 个答案:

答案 0 :(得分:3)

你的外循环迭代775146次。这是600851475143的sqrt。你的内循环迭代至少5次并且增加。所以迭代总数至少为3875730.这需要一段时间。

尝试插入内循环输入次数的计数。该计数将与代码的运行时间成正比。

答案 1 :(得分:1)

你的问题可能是因为在Javascript中这个代码:

var primes = [2,3,5,7,11];
console.log(primes[12]);

生成输出undefined,即使primes[12]超出了数组的范围。

Javascript在这方面不像其他语言 - 超出数组范围不会导致崩溃,而是返回一个未定义的值,并允许程序快速继续。 undefined是一个可以存储在变量中的实际值,因此它将继续评估if语句并在最后一次迭代后退出循环。

undefined的比较速度很慢,至少在Chrome中是这样。 See this Stackoverflow question for some performance information

相关问题