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