簡體   English   中英

這個 Triple 嵌套 for 循環的運行時間是多少?

[英]What is the running time of this Triple nested for loop?

這是代碼:

    for (int i = 0; i < 60; i++) {
        for (int j = i-1; j < N; j++) {
            for (int k = 0; k+2 < N; k++) {
                System.out.println(i*j);
                System.out.println(i);
                i=i+1;
             }
        }
    }

我相信它是 O(N^2) 因為在 for 循環中有兩個 N,但不太確定。 任何幫助表示贊賞,謝謝!

而是因為i循環有一個固定的限制。 說它是O(N^2)並不是錯誤的 IMO 但如果我們嚴格,那么復雜性是O(N^2 * log(N))

我們可以更正式地證明:

首先,讓我們擺脫了i的分析-loop。 i的值在k循環內遞增。 N很大時, i將在第一次迭代中大於60 ,因此i循環將只執行一次迭代。 為簡單起見,假設i只是一個用0初始化的變量。 現在的代碼是:

int i = 0;
for (int j = -1; j < N; j++) {      // j from - 1 to N - 1
    for (int k = 0; k+2 < N; k++) { // k from 0 to N - 1 - 2
        System.out.println(i*j);
        System.out.println(i);
        i=i+1;
    }
}

如果我們非常嚴格,那么我們將不得不查看i循環執行不止一次的不同情況,但僅當N很小時,這不是我們對大 O 感興趣的。讓我們忘記為簡單起見, i循環。

我們首先查看循環並說內部語句為此是常量。 我們分別來看。

在此處輸入圖片說明

我們可以看到循環的復雜度是O(N^2)

現在是報表: 有趣的是打印報表。 打印一個數字顯然是一個數字一個數字地完成的(簡單地說),所以它不是恆定的。 數字的位數隨數字成對數增長。 有關詳細信息,請參閱內容。 最后一條語句是不變的。

現在我們需要看一下數字(大致)。 i的值增長到N * N j的值增長到N 所以第一個打印打印一個數字,它會增長到N * N * N 第二個打印打印一個數字,該數字最大為N * N 所以內部身體的復雜度為O(log(N^3) + log(N^2)) ,也就是O(3log(N) + 2log(N)) ,也就是O(5log(N)) . 常量因子在大 O 中被丟棄,所以最終的復雜度是O(log(N))

將循環的復雜性和執行體的復雜性相結合,得出整體復雜性: O(N^2 * log(N))

詢問你的老師是否應該考慮印刷報表。

答案是 O(N^2 log N)。

首先,可以忽略外循環,因為它具有恆定的迭代次數,因此僅由常數因子起作用。 此外, i = i+1對時間復雜度沒有影響,因為它只操作外部循環。

println(i * j)語句的時間復雜度為O(bitlength(i * j)) ,其邊界為O(bitlength(N^2)) = O(log N^2) = O(log N) (對於其他println語句也類似。現在,這些println語句多久執行一次?

兩個內部循環是嵌套的,並且都從一個常數運行到N線性值,因此它們迭代O(N^2)次。 因此總時間復雜度為O(N^2 log N)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM