演算法導論之2-3思考題
阿新 • • 發佈:2019-02-19
題目:霍納規則的正確性:
寫出虛擬碼以實現樸素多項式求值(native polynomial-evaluation)演算法,它從頭開
始計算多項式的每一個項。這個演算法的執行時間是多少?與霍納規則相比其效能如何?
我用Java程式碼將其實現如下:
首先,寫出一個計算次方值的方法
/**
* 計算次方值
* @param a 底數
* @param b 指數
* @return
*/
public static double pow(double a, double b) {
double ret = a;
if ( b == 0 )
return 1;
for (int i = 1; i < b; i++)
ret = ret * a;
return ret;
}
其時間複雜度顯而易見為Θ(b)。
利用分治策略,我們還可以減小其時間複雜度,程式碼如下:
/**
* 計算次方值 遞迴版本
* @param a 底數
* @param b 指數
* @return
*/
public static double recursivePow (double a, int b) {
if ( b == 0 )
return 1;
if ( b == 1 )
return a;
//b為偶數
if ( b % 2 == 0 ) {
int mi = b / 2;
double temp = recursivePow(a,mi);
return temp * temp;
} else { //b為奇數
int mi = (int) b / 2 ;
double temp = recursivePow(a,mi);
return temp * temp * a;
}
}
我們可以寫出其遞迴式T(n) = T(n/2) + Θ(1),根據主方法可得其時間複雜度Θ(logb)
main方法如下:
public static void main(String[] args) {
double[] coefficient = { 1, 2, 34, 2, 56, 7, 8 };
double x = 5;
double result = 0;
for (int i = 0; i < coefficient.length; i++)
result += coefficient[i] * pow(x, i);
System.out.println(result);
}
所以用樸素多項式求值(native polynomial-evaluation)演算法,採用計算次方值的遞迴版本,其所用時間為O(nlogn);另一種版本的時間複雜度為O(n^2)
利用霍納規則求解方法如下:
/**
* 霍納規則
*/
public static double horner(double[] coefficient, double x) {
double y = 0;
for (int i = coefficient.length - 1; i >= 0; i--)
y = coefficient[i] + x * y;
return y;
}
所以用霍納規則求解所需時間複雜度為O(n)。