簡體   English   中英

以下遞歸 function 的時間復雜度是多少

[英]What would be the time complexity of below recursive function

下面的遞歸 function 的時間復雜度是多少?

我正在使用下面的 T(n) 但不確定我是否為這個 function 創建了正確的方程

T(n)=T(n-1)+n -> o(n^2)

public static int test2(int n){
    if(n<=0){
        return 0;
    }
    for(int i =0; i<=n; i++){
        for(int j =0; j<=n; j++){
            System.out.println(" in here " + i + j);
        }
        test2(n-1);
    }
    return 1;
}

我認為 function 是:T(n)=n(T(n-1))+n^2

O(n^2)單個非終止遞歸調用的時間復雜度,但不是整體時間復雜度。

每次調用test(n) ,如果它沒有達到遞歸的基本情況,就會創建n + 1個遞歸調用分支。

例如,如果n = 2 遞歸調用樹將是:

               t(2)
           /    |   \
          /     |    \
      t(1)     t(1)   t(1)
      /  \     /  \    /  \
  t(0) t(0) t(0) t(0) t(0) t(0) 

所以調用test(2)會導致9次遞歸調用。 如果我們調用test(3)它將產生40遞歸調用。

基本上我們有:

(n) * (n + 1 - 1) * (n + 1 - 2) * (n + 1 - 3) * ... until `n` doesn't turn to 1

這類似於階乘,如果我們忽略+1 ,它大致n! 遞歸調用。 每個都有時間復雜度O(n^2)

所以整體的時間復雜度可以表示為:

O(n^2 * n!)

我將從數學的角度來解決這個問題。

首先,你的 T(n) 方程不正確,它應該是:

T(n) = n * (T (n-1) + n)

原因是您有 n 次迭代,並且對於每次迭代(這就是產品的來源),您在進行 n 次迭代時進行遞歸。 所以基本上你會有:

T(n)   =  n    * T(n-1) +  n^2
T(n-1) = (n-1) * T(n-2) + (n-1)^2
T(n-2) = (n-2) * T(n-3) + (n-2)^2
.
.
.
T(2)   =  2    * T(1) + 2^2
T(1)   =  1    * T(0) + 1^2

其中 T(0) = 1 基本上給出了您的定義。 因此,現在通過一些重新排序和乘法,您將擁有:

T (n) = n^2 + n*((n-1)^2) + n*(n-1)*((n-2)^2) + ... + n*(n-1)*(n-2)*(n-3)*...*(n-(n-3))*(2^2) + (2 * n!) 

最后一個 2 * n 的原因。 是 T(1) = 2 並通過乘法得到 n 的系數..(對過程基本上從 T(n-1) 開始並將方程與 n 相乘並將其添加到 T 的方程(n) 你擺脫了 T(n-1)。但是你現在在 T(n) 的等式中有 T(n-2) 所以重復這個過程)所以我認為(但我不確定)時間復雜度將是 n! 而不是 n^2。 我希望這是有幫助的。

按時間替換操作,您可以建立以下循環:

T(0) = C0
T(n) =
    Σ{i=0..n}
        Σ{j=0..n}
            C1
        +
        T(n-1)
    + C2

這可以重寫

T(n) = (n+1).((n+1).C1 + T(n-1)) + C2 = (n+1).T(n-1) + (n+1)².C1 + C2

這個遞歸的精確解有點技術含量。 通過求解齊次方程,我們得到解C.(n+1)! 並通過我們設置的系數的變化

T(n) = (n+1)!.U(n)

然后

(n+1)!.U(n) = (n+1).n!.U(n-1) + C1.(n+1)² + C2

或者

U(n) = U(n-1) + C1/(n-2)! + 2C1/(n-1)! + C2/(n+1)!

我們認識到 e 的截斷級數,它很快收斂到一個常數並且

T(n) ~ C(n+1)! = O((n+1)!)

這是一個相當復雜的 function。讓我們從下往上移動,也許我們可以看到一些東西。

T(0) = 1
T(1) = 2 * (2 + T(0)) = 2 * (2 + 1) = 2 * 3 = 6
T(2) = 3 * (3 + T(1)) = 3 * (3 + 6) = 2 * 9 = 27
T(3) = 4 * (4 + T(2)) = 4 * (4 + 27) = 4 * 31 = 124

如果我們以不同的方式擴展它

T(1) = 2 * (2 + T(0))
T(2) = 3 * (3 + 2 * (2 + T(0)))
T(3) = 4 * (4 + T(2)) = 4 * (4 + 3 * (3 + 2 * (2 + T(0))))
...
T(n) = (n+1) * (n+1 + T(n)) = (n+1) * (n+1 + n * (n + T(n -1))) =
(n+1) * (n+1 + n * (n + (n-1) * ((n-1) + T(n-2))))

現在如果我們打開 T(n) 的括號

T(n) = (n+1)^2 + (n+1)n*(n + T(n-1)) = (n+1)^2 + (n+1)n^2 + (n+1)n(n-1)*((n-1) + T(n-1)) = ... 
= (n+1)^2 + (n+1)n^2 + ... + (n+1)n(n-1)...2^2 + (n+1)! = Sum[iProduct[j,{j,i,n}],{i,2,n}] + (n+1)!  

(我使用 wolfram alpha 作為總和,我希望它是正確的)

從最后的求和可以看出,求和的最大成員是(n+1)! 其他一切都會變小,所以我們可以忽略它們。 +1也毫無意義,所以我們也可以放棄它。 最終結果是您的遞歸 function 是o(n!)

如果有人問為什么n+1 ,那是因為循環條件是i<=n而不是i < n 另外,我已經好幾年沒有做過這種類型的分析了,我希望我沒有犯任何重大錯誤。

暫無
暫無

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

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