簡體   English   中英

分而治之解決數字的力量,利用主定理進行運行時分析

[英]Divide and Conquer to solve the power of a number, runtime analysis with master theorem

我實現了分治法來計算數字的冪:

public static void main(String[] args) {
    System.out.println("Result: " + pow(2, 1));
    System.out.println("Result: " + pow(2, 9));
    System.out.println("Result: " + pow(2, 8));
    System.out.println("Result: " + pow(2, 0));
}

private static int pow(int n, int pow) {
    if(pow == 0) {
        return 1;
    }

    if(pow > 2) {
        int leftPow;
        int rightPow;

        if(pow % 2 != 0) {
            leftPow = pow/2;
            rightPow = pow/2+1;
        } else {
            leftPow = pow/2;
            rightPow = leftPow;
        }

        return pow(n, leftPow) * pow(n, rightPow);
    } else {
        if(pow == 1) {
            return n;
        } else {
            return n * n;
        }
    }
}

我的方法似乎可行,因為輸出為:

Result: 2
Result: 512
Result: 256
Result: 1

現在,我正在嘗試使用主定理來確定算法的運行時間:

我認為

,由於遞歸調用出現了兩次,

,因為Iam會從一個問題中創建兩個子問題

,因為合並結果需要固定的時間。

分水嶺常數( ) 應該

使用這些值,我認為定理的第一條規則成立: ,帶有 ,因為

因此,運行時應為:

我完全不確定這個結果,因為我從來沒有這樣的情況

我的分析正確嗎?

首先,您應該注意,將基於pow解釋復雜性。 因此,分析中的n表示程序中的n變量不是pow

其次,由於比較和乘法之類的計算數量是恆定的(程序中小於10),因此f(n) = \\Theta(1) ,您可以在此處將其寫為f(n) = 1

因此,復雜度為T(n) = 2T(n/2) + 1 (您也可以看到Akra-Bazzi方法),並且T(n) = \\Theta(n)

暫無
暫無

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

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