- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
算法设计与分析课程设计论文
课题名称:多项式乘积的分治算法设计与实现
院系:计算机科学与信息工程学院
专业:计算机科学与技术(信息方向)11-1
姓名学号:潘强 201103020005
指导教师:冯慧玲
2013年12月
目录
一、算法介绍 3
二、问题描述 3
三、相关概念和数据结构介绍 4
四、算法设计与流程图 4
1.算法设计 4
2.流程控制图 5
五、算法分析 7
六、应用举例与程序代码 7
1.应用举例 7
2.核心代码 7
七、运行截图 10
八、总结 11
多项式乘积算法设计与分析
一、算法介绍
在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)分治法在每一层递归上都有三个步骤:
分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题;
解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题;
合并:将各个子问题的解合并为原问题的解。
它的一般的算法设计模式如下:
Divide-and-Conquer(P)
1. if |P|≤n0
2. then return(ADHOC(P))
3. 将P分解为较小的子问题 P1 ,P2 ,...,Pk
4. for i←1 to k
5. do yi ← Divide-and-Conquer(Pi) △ 递归解决Pi
6. T ← MERGE(y1,y2,...,yk) 合并子问题
7. return(T)
其中|P|表示问题P的规模;n0为一阈值,表示当问题P的规模不超过n0时,问题已容易直接解出,不必再继续分解。ADHOC(P)是该分治法中的基本子算法,用于直接解小规模的问题P。因此,当P的规模不超过n0时直接用算法ADHOC(P)求解。算法MERGE(y1,y2,...,yk)是该分治法中的合并子算法,用于将P的子问题P1 ,P2 ,...,Pk的相应的解y1,y2,...,yk合并为P的解。
Pn(x)= anxn +an-1xn-1+…+a1x+a0an是第n+1位上的数字,个位用a0表示)。如:9876=6+7*101+8*102+9*103
所以大整数相乘可以用多项式乘积的分治算法实现,实际上大整数相乘就是多项式乘积的一个特例。
把一个多项式分为两个
P (x)= P0(x)+ P1(x)xn/2
q(x)=q0(x)+q1(x)xn/2
P(x)*q(x)=P0(x)*q0(x)+P1(x)*P1(x)*xn+((P0(x)+ P1(x))*( q0(x)+q1(x))- P0 * q0 – P1* q1)* xn/2
令:R0= P0(x)*q0(x)
R1= P1(x)*q1(x)
R2= P0(x)+ P1(x))*( q0(x)+q1(x))- P0 * q0 – P1* q1
于是上式可化简为P(x)*q(x)= R0 +(R2- R0- R1)* xn/2+ R1*xn
上述过程可通过递归函数void pro(int p[],int q[],int r[],int n)人来实现求各项系数。求出各系数后还要通过void fe(int A[],int n)来处理各项系数,从而求出各乘积上各位的数字。
需要指出的是在调用void fe(int A[],int n)时,假设数组A[]上的元素依次为1 -20 1时,最后输出的结果将是: -101实际是-99。但在本实验中类似这种情况是不可能出现的,原因是:在求大整数乘积时传入的各项系数均为非负,于是总有高位满足被借1当10后高位仍为非负的。
2.流程控制图
设计流程控制图如下所示:
五、算法分析
很显然算法的时间复杂度由求各系数时调用void pro(int p[],int q[],int r[],int n)所决定
类似多项式的算法时间复杂度分析
f(2)=7 n=2
f(n)= 3f(n/2) +5n n2
通过换名是可以求出f(n)= O(nlog3)的
这个算法通过对大整数的乘积的解决来体现多项式乘积的实现与运用
其中函数void product1(float p[],float q[],float c[])完成多项式的系数的计算,函数void plus(float p[],float q[],float c[],int k)完成 数组p[]与数组q[]对应相加并把结果对应放到数组c[
文档评论(0)