一元多项式乘法算法
一般的,一元多项式相乘有两种算法:
令A(i)(0<=i<n)、B(j)(0<=j<m)表示多项式A、B所对应的第i、j项元素,C(i,j)表示A(i)*B(j)的结果。则有:
算法一:结果用链表存储
此算法用A(i)去乘B(j)(0<=j<m),逐项把每个结果插入结果链表ResultNode中。此算法下,每次相乘所得结果即C(i,j)要正确的插入ResultNode中,则要遍历链表以便合并同类项或生成新节点(若ResultNode有序,遍历量会相对减少)。
算法二:结果用大型数组存储
此算法会预先开辟一个很大的空间,如float result【10000】,数组长度会根据实际情况进行调整。操作时同样用多项式A中的每一项去乘多项式B中的每一项,每次相乘得到的结果C(i,j)都将加入下标与C(i,j)指数相同的数组元素。
算法一和算法二充分体现了时间与空间的矛盾:前者空间开销较小而时间开销较大,后者则恰恰相反。当然也有基于以上两种算法的变种算法,但其实质相同,并无较大改进。
下面,我们尝试一种空间与时间均较优的算法。
算法二造成空间浪费的主要原因在于无法预知最终多项式的项数,倘若可以预知结果多项式的项数,我们可以开辟较优的空间:若结果多项式的项数为num,我们可开辟空间
index1【num】和index2【num】,在index1中按序存放相乘中先出现的多项式指数,而与index2中相同下标数组元素则存放该指数相对应的系数,每计算出一个新结果时只需遍历数组index1即可,该法较上两法优,而在实现上,要确定最终多项式的项数,则必须先进行一次两个多项式相乘,随后再重复一次多项式相乘操作。显然,两次多项式相乘操作会使效率大打折扣。那可以仅进行一次多项式相乘便可以得到结果吗?可以!完全可以!
注意到多项式相乘时,关键因素是多项式指数确定问题,故为了简便明了,这里我们暂不考虑系数因素。而多项式相乘时,对结果指数而言,等效于将A,B多项式的任意两个指数相加,故我们可建立等效该数学模型:已知两集合Ah,Bh,定义集合Ah+Bh=Ch,这里
“+”操作是Ah,Bh两多项式的任意两元素相加所得到的集合。
为了更好的理解该算法原理,令Ah={1,2,5},Bh={1,2,5},求Ch;
编号: 0 1 2
Bh: 1 2 5
Ah: 1 2 5
如右图所示:
1) 因为Ah(0)+Bh(0) = 1 + 1 = 2 < Ah(1)+Bh(0)=2 + 1 = 3故2是尚未计算和结果中最小的一个。
2) 因为Ah(0)+Bh(1) = 1 + 2 = 3 ==Ah(1)+Bh(0)=2 + 1 = 3,Ah(2)+Bh(0) = 5+1= 6
所以3是尚未计算和结果中最小的一个。
3) Ah(0)+Bh(3) = 1 + 5 = 6 < Ah(1)+Bh(2)=2 + 5 = 7, Ah(2)+Bh(0) = 5+1= 6
所以6是尚未计算和结果中最小的一个。
4) Ah(1)+Bh(2)=2 + 5 = 7 == Ah(2)+Bh(1) = 5+2= 7
所以7是尚未计算和结果中最小的一个。
5) Ah(2)+Bh(2) = 5+5= 10
所以10是尚未计算和结果中最小的一个。
以上实例,并未模拟完全遍历Ah,Bh集合,但成功的求出了Ch。基于引例,我们可以得到其计算原则:
1)集合A,B均为升序,这是该算法的前提。
2)设立变量i=0,数组data【AhLength】用存放Ah中每个元素所对应的Bh中尚未进行计 算且计算结果不为最小和的元素的下标。
3)计算data1=Ah【i】+Bh【data【i】】,寻找满足Ah【j】+Bh【data【j】】<= data1且j>i的j是否存在,若不存在,则data1尚未计算和结果中最小的一个。否则,把j看做变量i,继续该操作,直到找到最大的j使其和最小。
4)若当前i多对应的data【i】<BhLength-1,则data【i】++,否则i++。
若data[AhLength-1] =BhLength,则所有加法和已找到,否则继续操作2。
其算法描述如下:
Int main(){
int anum,bnum; //定义Ah,Bh多项式项数
int i =0,j =0,k=0,tp = 0;
int data1 = 0,data2=0,temp = 0; //存放所得指数和的变量
input(anum); //输入Ah多项式项数
input(a【anum】); //输入Ah多项式
init(data【anum】); //初始化data【】数组
input(bnum); //输入Bh多项式项数
input(b【bnum】); //输入Bh多项式
//Ah,Bh按升序排列,如果有必要
sort(a);
sort(b);
//依次得到最小的指数和
while(data[anum-1]<bnum){
data1 = a[i]+b[data[i]];
j = data[i] -1 ;
k = i + 1;
temp = data1;
while(j>=0&&k<anum){
data2=a[k] + b[data[k]];
if(data2>temp){
if((k+1)==anum||data2<a[k+1]+b[data[k+1]])
break;
else{
data2 = a[k+1]+b[data[k+1]];
k ++;
j--;
}
}
if(data2==temp){
data[k]++;
k++;
}
else{
temp = data2;
tp = k;
k++;
j--;
}
}//内层while
if(temp>=data1)
data[i]++;
else{
data1 = temp;
data[tp]++;
}
if(data[i]>bnum-1)
i++;
//处理结果最小指数和data1,可以保存亦可直接输出,这里省略。
}
}
指数问题一旦解决了,那么计算系数时,只要加上计算对应系数乘积和便可。
附:附件中有其简单的基本实现程序。
分享到:
相关推荐
(2)设计算法实现一元多项式乘法; (3)分析算法的时间复杂度和空间复杂度 一、总体设计 1 二、详细设计 1 2.1存储结构 1 2.2建立链表 1 2.3遍历操作 1 2.4多项式相乘算法 2 三、调试与测试 2 3.1方案一 2 3.2...
1) 问题描述 已知A(x)=a0+a1x+a2x2+……+anxn和B(x)=b0+b1x+b2x2+……+bmxm,并且在A(x)和B(x)中指数相差很多,求A(x)=A(x)*B(x)。...(2)设计算法实现一元多项式乘法; (3)分析算法的时间复杂度和空间复杂度。
已经运行出来了,可执行,非常好用
开辟多项式所需空间、判断用户输入正确与否、构造节点存放多项式系数和指数、构造多项式、多项式整理(按指数从小到大存放)、撤销多项式所在节点、合并同类项、多项式加法、多项式减法、多项式乘法、多项式长度计算...
题目:n元多项式乘法 功能: 完成两个n元多项式作乘法,给出明确的等式形式。 分步实施: 1. 初步完成总体设计,搭好框架,确定人机对话的界面,确定函数个数; 2. 完成最低要求:建立一个文件,实现两个一元二次...
进行多项式运算,运用链表,队列,数组等数据结构。
一元多项式的加减乘算法实现,完成两个一元多项式作加法、减法、乘法,给出明确的等式形式。完成总体设计,搭好框架,确定人机对话的界面,确定函数个数;函数功能要划分好,总体设计应画流程图,程序一定要经得起...
算法分析与设计的课程设计(一元多项式的加法、减法、乘法的实现).rar
设有一元多项式Am(x)和Bn(X),编程实现多项式Am(x)和Bn(x)的加法、减法和乘法运算。其中多项式描述为: Am(x)=A0+A1x1+A2x2+A3x3+….+Amxm; Bn(x)=B0+B1x1+B2x2+B3x3+….+Bnxn。 2、主要数据类型与变量 typedef ...
用单链表实现一元多项式的乘法。多项式的每一项含在一个单元中,并且这些单元以次数递减的顺序排序,将相乘结果保持到一个新的单链表中。其中比较困难的在于,当两个多项式相乘的时候所得到的多项式必须合并同类项。
1)算法要求:进行一元多项式的加、减、求导、乘法运算,多项式在某点处的函数值。 2.)输入要求:输入以系数、指数对的形式输入,表示多项式的某项的次数和系数 多项式每一项输入可以不按顺序,可以次数重复,需做...
2021-07-15:一元多项式的乘法计算(C++):https://blog.csdn.net/qq_45913057/article/details/118851829
在数学上,一个一元多项式Pn(x)可按升幂写 成: Pn(x) = p0+ p1x+ p2x2+….+ pnxn 它由n+1个系数唯一确定,因此,在计算机里,它可用一个线 性表P来表示: P = (p0 ,p1 ,p2 ,… pn)每一项的指数i隐含在其系数pi的...
在C语言下实现多项式的四则运算及合并同类项,并按升序排序的功能,已成功运行!功能模块包括合并同类项,升序排序,创建多项式,输出多项式,加法,减法,乘法,除法。
算法分析与设计的课程设计(一元多项式的加法、减法、乘法的实现).doc
在进行曲线拟合时用的最多的是最小二乘法,其中以一元函数(线性)和多元函数(多项式)居多,下面这个类专门用于进行多项式拟合,可以根据用户输入的阶次进行多项式拟合,算法来自于网上,和GSL的拟合算法对比过,...
多项式的各种运算用 matlab 实现的 算法高效 实用 请大家放心下载 呵呵 呵呵额呵呵
算法分析与设计的课程设计(一元多项式的加法、减法、乘法的实现).doc
此次上机实验应用了线性表实现了一次实际操作,完成了一个一元多项式的简单计算器,不仅对此次编译程序的算法思想有了新的认识,还让我深刻的体会到了线性表的重要性以及其应用的方便,并且对指针加深了映象,应用了...