簡體   English   中英

用兩個遞歸情況確定遞歸方法的Big O?

[英]Determining the Big O of a recursive method with two recursive cases?

我目前正在努力計算Big O的遞歸指數函數,只要n%2 == 0,它就會獲得一個快捷方式。代碼如下:

public static int fasterExponent(int x, int n){
    if ( n == 0 ) return 1;
    if ( n%2 == 0 ){
        int temp = fasterExponent(x, n/2);
        return temp * temp;
    }
    return x * fasterExponent(x, --n); //3
}

我理解,如果沒有(n%2 == 0)的情況,這個遞歸指數函數將是O(n)。 包含(n%2 == 0)的情況會加快執行時間,但我不知道如何確定它的復雜性和它的證據c的值。

答案是O(log n)。

原因: fasterExponent(x, n/2)這是每一步輸入的一半,當它達到0時,我們就完成了。 這顯然需要log n步驟。 但是fasterExponent(x, --n); 我們在輸入是奇數時執行此操作,在下一步中它將是偶數並且我們回退到n / 2情況。 讓我們考慮每次將n除以2時必須執行此操作的最壞情況。然后,每次執行第一個遞歸步驟時,我們都會執行第二次遞歸步驟。 所以我們需要2 * log n個操作。 那仍然是O(log n)。 我希望我的解釋有所幫助。

可以直觀地看出,在每個階段,您都將問題規模縮小了一半。 例如,要查找x 4 ,您會找到x 2 (我們稱之為A),並將結果返回為A * A. 再次通過將x 2除以x和x得到x 2。

考慮將兩個數相乘作為基本運算,您可以看到重復是:

T(N) = T(N/2) + O(1)
Solving this recurrence(using say the Master Theorem) yields:
T(N) = O(logN)

暫無
暫無

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

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