[英]Big-O complexity of recursion with nested loops
准備考試我在一個舊考試中遇到了這個問題:
此函數最壞的情況/ big-O復雜度是多少?
float foo(float[] A) {
int n = A.length;
if (n == 1) return A[0];
float[] A1 = new float[n/2];
float[] A2 = new float[n/2];
float[] A3 = new float[n/2];
float[] A4 = new float[n/2];
for (i = 0; i <= (n/2)-1; i++) {
for (j = 0; j <= (n/2)-1; j++) {
A1[i] = A[i];
A2[i] = A[i+j];
A3[i] = A[n/2+j];
A4[i] = A[j];
}
}
return foo(A1)
+ foo(A2)
+ foo(A3)
+ foo(A4);
}
(是的,代碼沒有意義,但這正是它的編寫方式)。
讓我感到困擾的是,每個遞歸級別的n的總大小加倍,但是建議的答案(最終結果為O(log n * n^2)
)忽略了這一部分。 我誤會了嗎?
編輯:用語法上正確的(但仍無意義的)代碼替換了半偽代碼。
如果您解決此遞歸關系,則可以確定復雜性。
T(n) = 4T(n/2) + O(n²)
用
T(1) = c
好吧,我終於明白了。
每次遞歸時,函數調用的次數是上次的4倍,因此,如果將遞歸級別定義為m
則每個級別的函數調用次數為
每次遞歸時,我們還將數組的大小減半,因此每個函數調用的工作量為
在每個遞歸級別上,總共要做的工作是:
實際上4^m
與(2^m)^2
:
因此,工作量可以寫成n^2
:
有log n
遞歸級別。
因此,總工作量為O(n^2 * log n)
,這是因為有4個遞歸調用。
如果只有2個遞歸調用,則每個級別的工作量為
我們不能很好地減少(但是如果我的數學正確的話,結果是O(n^2)
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.