对多项式函数求值的方法:
1、最直观的的方法:把每一项求值后相加
优点:容易实现,数据规模不大时可以使用
缺点:时间和空间效率不高,数据规模过大时不再适用
2、高效算法:霍纳法则(秦九韶算法)
根据该法则,将n阶多项式转化为如下形式进行计算,可以降低计算复杂度
Pn(X)=anxn+an−1xn−1+⋅⋅⋅+a1x+a0=((...(((anx+an−1)x+an−2)x+an−3)...)x+a1)x+a0
第一种方法需要 n+...+1=n(n+1)2 次乘法和n次加法,而第二种方法则需要n次乘法和n次加法
Horner法则计算多项式函数的cpp实现:
//horner.cpp
#include <iostream>
using namespace std;
int Horner(int *a, int x, int n)
{
int i, sum = 0;
for(i=0; i<n; i++)
{
sum = *(a+i) + x*sum; //数组的0位置上放a_n,n位置上放a_0
}
return sum;
}
int main()
{
int *a, x, n, i;
cout << "Please input order n, variable X:" << endl;
cin >> n >> x;
cout << "order: " << n << "\n" << "X: " << x << endl;
cout << "Please input n+1 coefficients:" << endl;
a = (int *)malloc(n+1);
for(i=n; i>=0; i--)
cin >> a[i] ;
cout << a[0] << "+";
for(i=1; i<n; i++)
cout << a[i] << "x^" << i << " + ";
cout << a[n] << "x^" << n << "=" << Horner(a,x,n) << endl;
}
利用Horner法则计算散列函数:
Index Hash(const char *key, int TableSize)
{
unsigned int HashVal = 0;
while(*key != '\0')
HashVal = (HashVal <<5) + *key++;
return HashVal % TableSize;
}