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