Horner法则(秦九韶算法 )的程序实现

注:《数据结构与算法分析——C》习题2.10 学习笔记
(另外大家在使用csdn时一定要注意 有时候写新文章时会显示最近编辑的一篇文章,如果此时没有点“写新文章”那么在发表后会覆盖之前保存的文章=。= 大家也都知道 覆盖比删除更彻底 ,所以大家在使用的时候一定要注意这点。。。)


另外介绍一个可以在线编辑LaTex公式的网站
http://latex.codecogs.com/eqneditor/editor.php


知识预习

Horner法则在中国叫做秦九韶算法
https://zh.wikipedia.org/wiki/%E7%A7%A6%E4%B9%9D%E9%9F%B6%E7%AE%97%E6%B3%95
()

原题描述

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 =  {21084};
        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运算时间。

你可能感兴趣的:(【Java】,【算法】,【C】,【数据结构与算法分析】,c语言,算法,java,秦九韶,Horner)