簡體   English   中英

計算遞歸算法的時間復雜度。

[英]Calculating time complexity of recursive algorithm.

我剛剛開始解決Topcoder算法問題,並用Java編寫了針對SRM 466 Div 2 LotteryTicket問題的算法。

由於我對時間復雜度不好,因此如果有人可以向我解釋如何逐步計算此算法的時間復雜度。

public static String buy1(int price,int...b){
    int sum=0; String stat="IMPOSSIBLE";

    for(int i=0;i<b.length;i++)
        sum=sum+b[i];

    if(sum==price)
        return "POSSIBLE";

    if(b.length>1){
        stat=buy1(price,Arrays.copyOfRange(b,0,b.length-1));
        stat=buy1(price,Arrays.copyOfRange(b,1,b.length));
    }

    return stat;
}

對於您的情況,遞歸關系為(讓b.length()為bn)

                     ___________buy1(p,bn-1) (as (b,0,b.length-1) equivalent is bn-1 in number )
                    /
    buy1(p,bn) ____/
                   \
                    \___________ buy1(p,bn-1)  (as (b,1,b.length) equivalent is bn-1 in number )

所以我們的問題是n = n-1的兩個子問題,因此我們的時間函數T(n)如下

   T(n)=2T(n-1)+c (For convenience lets eliminate c as it is very less compared to T(n) for this instance )
   T(n)=2[2(T(n-2))]
   T(n)=2{2[2(T(n-3))]} ===> 2poweri(T(n-i))  -------- equation(1)

當滿足基本條件時,重復結束。 假設T(0)= c(是基本條件),這意味着t(ni)= t(0)是基本條件。所以i = n

將i值代入方程式(1),我們得到2power(n){t(0)}

因此我們的時間函數值將為2power(n),程序的復雜度等於bigoh(2power(n))

您可以使用遞歸樹方法和主方法來查找復雜性。

請查看此內容 ,以獲取有關如何解決此問題的更多想法。

作為附加練習,請嘗試使用此方法計算合並排序的復雜性。

有趣的問題。 讓我們正確地計算它;)因此,當條件(sum ==價格)永遠不會出現時,我們將檢查最壞的情況。

首先,讓我們在b.length = 1時檢查完整性。然后,在循環內僅應使用一個“ =”操作:

for(int i=0;i<b.length;i++)

和2內部初始化:

int sum=0; String stat="IMPOSSIBLE";

下一步。 讓我們為N計算此任務。首先,您需要在循環的第一個內部執行N“ =”操作,在初始化內部執行2個操作,在if內部執行2個操作。

    stat=buy1(price,Arrays.copyOfRange(b,0,b.length-1));
    stat=buy1(price,Arrays.copyOfRange(b,1,b.length));

在遞歸步驟中進行另一個操作。 因此,對於這種情況,我們可以使用遞歸公式,等於:

f(n)= 4 + n + 2 * f(n-1),f(1)= 3

該方程的解為:f(n)= -6 + 5 * 2 ^ nn

因此,您的算法的靈活性是指數級的。 O(2 ^ n)我忽略了除“ =”之外的所有其他運算,因為它們不會改變漸近復雜度。

暫無
暫無

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

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