1. 程式人生 > >Horner法則(秦九韶演算法 )的程式實現

Horner法則(秦九韶演算法 )的程式實現

注:《資料結構與演算法分析——C》習題2.10 學習筆記
(另外大家在使用csdn時一定要注意 有時候寫新文章時會顯示最近編輯的一篇文章,如果此時沒有點“寫新文章”那麼在發表後會覆蓋之前儲存的文章=。= 大家也都知道 覆蓋比刪除更徹底 ,所以大家在使用的時候一定要注意這點。。。)

知識預習

原題描述

2.10 考慮下述演算法(稱為Horner法則)。計算F(X)=Ni=0AiXi的值

Poly = 0;
for(i = N; i >= 0; i--)
    Poly = X * Poly + A[i]

a. 對X = 3, F(X)=4X4+8X3+X+2 指出該演算法的各步時如何進行的。
b.解釋該演算法為什麼能夠解決這個問題。
c.該演算法的執行時間是多少?

分析過程

按照其思路我們

class test{
    public static long poly2(int[] arr, int x, int n){
        //arr儲存係數, x 表示基數, n 表示冪
        long poly = 0;
        for(int i = n; i >= 0; i--)
            poly = poly * x + arr[i];
        return poly;
    }

    public static void main(String[] args) {
        int[]b =  {2
1084}; System.out.println(poly2(b,3,4)); } }

上圖是用Java語言寫了一下 ,首先我們按照法則把這個公式分解開

x(x(x(4x+8))+1)+2

  是這樣的,那麼我們在單步除錯上面程式的時候發現程式也確實是按照這個來計算的,但是有一點需要注意那就是係數陣列的順序
它的正序或者倒序取決於for迴圈是如何編寫的,例如下面的程式我們就可以正序書寫係數陣列


class test{

    public static long poly2(int[] arr, int x, int n){
        //arr儲存係數, x 表示基數, n 表示冪
long poly = 0; for(int i = 0; i <= n; i++) poly = poly * x + arr[i]; return poly; } public static void main(String[] args) { int[]b = {4,8,0,1,2}; System.out.println(poly2(b,3,4)); } }

效率以及意義

效率

對於一個n次的多項式函式,用常規方法(用重複乘法計算冪,再把各項相加)計算出結果最多需要n次加法和(n2+n)2 次乘法。若用x迭代的方法計算冪則需要n次加法和2n+1次乘法。如果計算中的數值資料是以位元組方式儲存的,那麼常規方法約需要x佔用的位元組的2n倍空間。

  而使用秦九韶演算法時,至多隻需作n次加法和n次乘法,最多需要x佔用的位元組的n倍空間

意義

該演算法看似簡單,其最大的意義在於將求n次多項式的值轉化為求n個一次多項式的值。在人工計算時,利用秦九韶演算法和其中的係數表可以大幅簡化運算;對於計算機程式演算法而言,加法比乘法的計算效率要高很多,因此該演算法仍有極大的意義,用於減少CPU運算時間。