繁体   English   中英

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

[英]Why does this for loop take so long?

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

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

我这样解决了:

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);

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

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

i <= primes.length

当这个改变到位时,程序花了72084.540ms

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

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

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

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

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

您的问题可能是由于在Javascript中这个代码:

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

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

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

undefined比较很慢,至少在Chrome中是这样。 有关一些性能信息,请参阅此Stackoverflow问题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM