簡體   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