[英]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.