【变治法】霍纳法则C++代码实现,求一个多项式在一个给定点的值

来源:互联网 发布:vero moda淘宝旗舰店 编辑:程序博客网 时间:2024/05/01 01:51

一、霍纳法则算法原理

假设有n+1个实数a0,a1,…,an,和x的序列,要对多项式Pn(x)= anx ^n+a(n-1)x^(n-1)+…+a1x+a0求值。通过如下变换我们可以得到一种快捷的算法,即Pn(x)= anx ^n+a(n-1)x^(n-1)+…+a1x+a0=((…(((anx +an-1)x+an-2)x+ an-3)…)x+a1)x+a0,这种求值的安排我们称为霍纳法则。

例如,当x=3时,计算p(x)=2x^4-x^3+3x^2+x-5的值。对于多项式p(x)=2x^4-x^3+3x^2+x-5,我们按霍纳法则进行变换,有:

p(x)=2x^4-x^3+3x^2+x-5

=x(2x^3-x^2+3x+1)-5

=x(x(2x^2-x+3)+1)-5

=x(x(x(2x-1)+3)+1)-5

二、霍纳法则二维表格计算

①在实际的操作过程中,我们只需要一个该多项式系数的原始列表。

②该表第一行包含了该多项式的系数(如果存在等于0的系数,也都包含进来),从最高的an到最低的a0。

③第二行中除了第一个和第二个单元格用来存储x和an外,其它单元格都用来存储中间结果。

④在作了这样的初始化后,在计算第二行的某一个单元格的值时,用该单元格的前一个单元格乘以x的值再加上该单元格的第一行的系数即可。用这种方式算出的最后一个单元格的值,就是该多项式的值。

最高次数为n,那么表格列数就为n+1

这里写图片描述

三、霍纳法则代码实现

①伪代码:

Horner(P[0..n],x) //用霍纳法则求一个多项式在一个给定点的值 //输入:一个n次多项式的系数数组P[0..n](从低到高存储),以及一个数字x //输出:多项式在x点的值 p<-P[n] for i<-n-1 downto 0 do      p<-x*p+p[i]return p

②霍纳法则C++实现:

#include <iostream>using namespace std;int LEN = 3;int hornor(int list[],int n,int x)   //利用递归实现霍纳规则   {       if(n == LEN-1)       {           return list[LEN-1];//递归出口       }       else       {                                                                                                                   return hornor(list,n+1,x)*x+list[n];//递归过程       }   }  int main(){int a[3]={1,2,3};//数组表示多项式的系数  int x=3;//多项式的自变量值  int result=0;//存放结果 result = hornor(a,0,3);   cout<<result<<' ';cout<<endl;exit(0);    return 0;}

四、霍纳法则时间复杂度VS直接方法时间复杂度

①直接方法:对每一项分别求值,并把每一项求的值累加起来,这种方法十分低效,它需要进行n+(n-1)+…+1=n(n+1)/2次乘法运算和n次加法运算。

②而霍纳法则只需要n次乘法与n次加法

阅读全文
0 0
原创粉丝点击