簡體   English   中英

誤解小細節w /嵌套for循環時間復雜度分析...如何分辨O(n)和O(n²)分開

[英]Misunderstanding small details w/ nested for-loop time complexity analysis… How to tell O(n) and O(n²) apart

對於以下算法:

 int x = 0;
 for (int i = 0; i < n; i++)
     for (j = 0; j < n; j++) {
         if (j < i) j = j + n;
         else x = x + 1;
      }

所以對於這個算法,我的思維過程是這樣的:

i=0時,內循環對j執行n次迭代。 但是,對於i=0,1..n-1每個值, j將只執行一次迭代,因為if語句將計算為true並結束內部循環。

這是我的困惑之源:

由於外循環將執行n次迭代,無論如何,並且由於內部循環在i=0 (非常第一次迭代)時執行n次迭代,為什么大時間復雜度不是O(n²)而是, O(n)如果循環嵌套並且在第一次迭代中都執行n次迭代?

你有一條線說if (j < i) j = j + n; 它基本上脫離了循環(當j < i ),並且由於內循環從0開始,這將在每次第一次迭代時觸發(第一次除外),使其在恆定時間內運行。

你基本上只有一個循環。 代碼可以重寫為

int x = 0;
for (int i = 0; i < n; i++) {
    x = x + 1;
}

這清楚地說明了為什么它是O(n)。

你可以從內循環打印ij的值:

for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
        System.out.print(i + "" + j + " ");
        if (j < i) j = j + n;
        else x = x + 1;
    }
    System.out.println();
}

輸出:

00 01 02 03 04 ..
10
20
30
40
..

它僅代表矩陣的第一行和第一列,因此復雜性為:

O(2n) => O(n).

你正確地注意到只有i=0內循環才會迭代n次。 對於i>0內部循環僅運行一次。 我們可以求和所有這些迭代:i 0 + i 1 + ... + n-1 ,其中i 0 =n ,對於其他索引i x =1 因此,內部迭代的總和將是n + n - 1 => 2n - 1 這給出了我們: O(2n - 1) => O(2n) - O(1) => 2*O(n) - O(1) => O(n)

對於每n次外迭代,都有n次內迭代。 因此,您將進行n * n = n ^ 2次計算,因此復雜度為O(n ^ 2)。 這有意義還是更令人困惑?

暫無
暫無

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

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