1. 程式人生 > >演算法導論之2-3思考題

演算法導論之2-3思考題

題目:霍納規則的正確性:
寫出虛擬碼以實現樸素多項式求值(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)。