[英]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)。
你可以從內循環打印i
和j
的值:
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.