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