簡體   English   中英

嵌套循環的Big-O遞歸復雜度

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

每次遞歸時,我們還將數組的大小減半,因此每個函數調用的工作量為

(n / 2 ^ m)^ 2

在每個遞歸級別上,總共要做的工作是:

4 ^ m *(n / 2 ^ m)^ 2

實際上4^m(2^m)^2

4 ^ m =(2 ^ 2)^ m = 2 ^ 2m =(2 ^ m)^ 2

因此,工作量可以寫成n^2

4 ^ m *(n / 2 ^ m)^ 2 =(2 ^ m *(n /(2 ^ m))^ 2 = n ^ 2

log n遞歸級別。

因此,總工作量為O(n^2 * log n) ,這是因為有4個遞歸調用。

如果只有2個遞歸調用,則每個級別的工作量為

2 ^ m *(n / 2 ^ m)^ 2

我們不能很好地減少(但是如果我的數學正確的話,結果是O(n^2) )。

暫無
暫無

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

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