ImageVerifierCode 换一换
格式:DOCX , 页数:24 ,大小:225.15KB ,
资源ID:24850001      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/24850001.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(算法部分作业答案.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

算法部分作业答案.docx

1、算法部分作业答案算法部分作业答案(总18页)算法:是对特定问题求解步骤的一种描述,是指令的有限序列。 程序:当一个算法用某种程序设计语言来描述时,得到的就是程序,也就是说,程序是用某种程序设计语言对算法的具体实现. 算法有输入、输出、确定性、能行性和有限性等特征,当不具备有穷性时,只能叫做计算过程,而不能称之为算法,算法可以终止,而程序没有此限制。程序证明和程序测试的目的各是什么? 程序证明是确认一个算法能正确无误的工作. 程序测试的目的是发现错误1-9 解: n!的递归定义: 求解n!的递归函数long Factorial (long n) if(n0) cout”error!”;exit(

2、0);if(n=0) return 1; else return n *Factorial (n-1);1-10使用归纳法,证明上题所设计的计算n!的递归函数的正确性 证明(归纳法证明): (1)首先,如果n=0,那么程序执行if(n=0) return 1;返回1,算法显然正确;(2)假定函数Factorial对n1)能正确运行,那么,当n=k时,算法必定执行:else return k *Factorial (k-1);因为Factorial (k-1)正确,所以,当n=k时,程序运行正确综合以上两点,可得程序正确.证毕.2-1, 简述衡量一个算法的主要性能标准,说明算法的正确性与健壮性的

3、关系 答: 衡量一个算法的主要性能指标有:正确性,简单性,高效低存储,最优性 算法的正确性与健壮性的关系:所谓算法的正确性:是指在合法的输入下,算法应实现预先规定的功能和计算精度要求;所谓算法的健壮性,是指当输入不合法时,算法应该能按某种预定的方式做出适当的处理;正确的算法不一定的是健壮的,健壮的算法也不一定是完全正确的.正确性和健壮性是相互补充的.一个可靠的算法,要求能在正常情况下正确的工作,而在异常情况下,亦能做出适当处理.2-9(1)设计一个C/C+程序,实现一个n*m的矩阵转置,原矩阵与其转置矩阵保存在二维数组中.Void reverse(int *a,int *b,int n,int

4、 m) For(int i=0;in;i+) For(int j=0;jm;j+) bji=aij;(2)使用全局变量count,改写矩阵转置程序,并运行修改后的程序以确定此程序所需的程序步 Void reverse(int *a,int *b,int n,int m,int &count) int i=0;count+;int j=0;count+; For(;in;i+) For(;jn0时,有5n2-8n+2=1时程序执行n *Factorial (n-1);此时T(n)= T(n-1)+1故: 替换法: T(0)=0,T(1)=1,T(2)=2- 总结得到:T(n)=n;归纳法证明:(

5、1),当n=0时,T(0)=0,结论成立;(2)假设当k=0有T(n)=n;成立. 迭代法: T(n)=T(n-1)+1 =(T(n-2)+1)+1=(T(n-3)+1)+1)+1=.=T(0)+1+1.+1(n个1)=n2-19 利用递归树计算递推方程 假设n=2k,那么,总共有logn+1(即k+1)层,非递归部分之和为n2+n2/21+n2/22+n2/2k=(1+1/2+1/22+1/23+1/2logn)n2 =2n2+2n=O(n2)5-8三分搜索算法的做法是:它先将待查元素X与n/3处的元素比较,然后将X与2n/3处的元素比较,比较的结果或者找到X,或者将范围缩小到原来的n/3i

6、nt Search3(int a,int left,int right,int x) /*递归算法*/ int l,u; if(leftau) return Search3(a, u+1, right,x); else if(xal) return Search3(a, l+1, u-1,x); else return Search3(a, left, l-1,x); return -1;void main() int n,*a; int x,i; coutn;(1) a=new intn; 假设当n=2)时,算法正确,即对于所有元素个数小于n的元素集,算法能正确排序.那么,当n= right

7、-left+1时,算法执行程序段:int k=(right-left+1)/3;stoogesort(a,left,right-k);stoogesort(a,left+k,right); stoogesort(a,left,right-k);由假设可知:以上三条语句都能正确运行,所以,当n= right-left+1时,算法正确. 由以上两点可知,算法正确. 分析算法的时间复杂度: 排序算法,基本运算仍然是元素之间的比较,所以,算法时间复杂度为: (用替换或迭代法计算之即可)6-1设有背包问题实例,n=7,(w0,w1,w2,w3,w4,w5,w6)=(2,3,5,7,1,4,1),(p0,

8、p1,p2,p3,p4,p5,p6)=( 10,5,15,7,6,18,3),M=15。求这一实例的最优解及最大收益.解:首先,选择最优量度标准为收益重量比;其次, 依据收益重量比的非增次序对输入(物品)进行排序 (p0/w0,p1/w1,p2/w2,p3/w3,p4/w4,p5/w5,p6/w6)=(5,5/3,3,1,6,3) 对物品排序结果为:4,0,5,2,6,1,3最后,进行贪心选择: X=(4) X=(4,0) X=(4,0,5) (剩余载重)U=14 U=12 U=8 (收益) P=6 P=6+10=16 P=16+18=34 X=(4,0,5,2) X=(4,0,5,2,6)

9、X=(4,0,5,2,6,1(2/3) (剩余载重)U=3 U=2 U=0 (收益) P=34+15=49 P=49+3=52 P=52+2/3*5=所以,最优解为x=(1,2/3,1,0,1,1,1); 即装入第0,2,4,5,6物品和第1个物品的2/3 最大收益: P=6-2,0/1背包问题是一种特殊的背包问题,装入背包的物品不能分割,只允许或者整个物品装入背包,或者不装入,即xi=0,或1,(0=i=1, d2=4=2,所以,X中作业均能如期完成,将作业2加入子集X中. 子集X中的最大可用下标k=k+1=1X:62考虑作业3.首先搜索作业3在X集合中的插入位置,使得X集合中的元素按作业的

10、截止时限的非减次序排序,因为d6=2, d2=4,而d3=3所以,可将作业3插在作业6的后面,作业2的前面,得到X=(6,3,2),X:6320 1 2 3 4 5 6 k 考虑X中的作业能否均如期完成?因为d6=2=1, d3=3=2, d2=4=3所以,X中作业均能如期完成,将作业2加入子集X中. 子集X中的最大可用下标k=k+1=2X:632考虑作业5.首先搜索作业5在X集合中的插入位置,使得X集合中的元素按作业的截止时限的非减次序排序,因为d6=2, d2=4, d3=3而d5=1所以,可将作业5插在作业6的前面,得到X=(5,6,3,2),X:5632 考虑X中的作业能否均如期完成?

11、因为d5=1=1,d6=2=2, d3=3=3, d2=4=4所以,X中作业均能如期完成,将作业5加入子集X中. 子集X中的最大可用下标k=k+1=3X:5632考虑作业1.首先搜索作业1在X集合中的插入位置,使得X集合中的元素按作业的截止时限的非减次序排序,因为d5=1,d6=2, d3=3,d2=4,而d1=3所以,可将作业1插在作业2的前面,作业3的后面,得到X=(5,6,3,1,2),X:56312 考虑X中的作业能否均如期完成?因为d5=1=1,d6=2=2, d3=3=3, d1=34所以,X中1作业不能如期完成,所以,不能将作业1加入子集X. X:5632 接着考虑作业0,4均不

12、能加入子集X,故,执行JS得到的最优解为X=(5,6,3,2),最大收益为P=p5+p6+p3+p2=30+20+18+6=746-17,最佳装载问题是将一批集装箱装上一艘载重为C的轮船,其中集装箱i的重量为wi(0=i0, wi0求X=()使得并且使最大 (2)以重量作为最优量度标准,以重量最轻者先装来选择集装箱装上船(3)设(x0,x1,-xn-1)是最优装载问题的最优解,则易知(x1,x2,-xn-1)是轮船载重为C-x0w0且待装船的集装箱为1,3-n-1时相应最优装载问题的一个最优解,即最优装载问题具有最优子结构特性。否则,假设(x1,x2,-xn-1)不是子问题的最优解,假设有另一

13、个解Z=(z1, z 2,- z n-1)是子问题的最优解,则有:则:且,即(x0,z1, z 2,- z n-1)是最优装载问题的最优解,与(x0,x1,-xn-1)是最优装载问题的最优解矛盾,所以, (x1,x2,-xn-1)是子问题的最优解,故最优装载问题具有最优子结构特性。(4) 参考程序1 /*箱子信息结构体*/struct goodinfo float w; /*箱子重量*/ int X; /*箱子存放的状态*/ int flag; /*箱子编号*/;/*按物品重量做升序排列*/void sort(goodinfo goods,int n) int j,i; for(j=2;j=n

14、;j+) goods0=goodsj; i=j-1; while (goods0.wgoodsi.w) goodsi+1=goodsi; i-; goodsi+1=goods0; /*用贪心法对物品进行选择装入*/void loading(goodinfo goods,float M,int n) float cu; int i,j; int A=0;/*对装入箱子进行计数*/ for(i=1;i=n;i+)/*赋初值*/ goodsi.X=0; cu=M; /*船的剩余载重*/ for(i=1;icu)/*当该箱重量大于剩余载重跳出*/ break; goodsi.X=1; A+; cu=c

15、u-goodsi.w;/*确定船的剩余载重*/ for(j=2;j=n;j+)/*对箱子按序号大小作升序排列*/ goods0=goodsj; i=j-1; while (goods0.flaggoodsi.flag) goodsi+1=goodsi; i-; goodsi+1=goods0; cout 最优解为:endl;/*输出*/ for(i=1;i=n;i+) cout 第i件物的存放状态:; coutgoodsi.Xendl; coutendl; coutendl; cout 最多能装入的箱子数为:; coutAendl;(5) 首先,选择最优量度标准为重量;其次, 依据集装箱重量的

16、非减次序对输入(物品)进行排序 对集装箱的排序结果为:5,2,0,3,1,4,6最后,进行贪心选择: X=(5) X=(5,2) X=(5,2,0) (剩余载重)U=24 U=21 U=17 X=(5,2,0,3) X=(5,2,0,3,1) X=(5,2,0,3,1) (剩余载重)U=12 U=6 所以,最优解为 X=(0,1,2,3, 5),最优解值为5参考程序2public static float loading(float c, float w, int x) int n=; Element d = new Element n; for (int i = 0; i n; i+) di

17、 = new Element(wi,i); (d); float opt=0; for (int i = 0; i n; i+) xi = 0; for (int i = 0; i n & di.w = c; i+) xdi.i = 1; opt+=di.w; c -= di.w; return opt; 7-5设有4 个矩阵连乘积ABCD:A: 45*8, B: 8*40, C: 40*25, D: 25*10, ,请求出它们的最优计算次序和计算量。解:p0=45,p1=8,p2=40,p3=25,p4=10 可只给出矩阵形式计算m矩阵为: m01= p0*p1* p2=45*8*40=14

18、400;m12= p1*p2* p3=8*40*25=8000;m23= p2*p3* p4=40*25*10=11250; m02= m00+m12+p0*p1* p3=8000+45*8*25=8000+9000=17000= m01+m22+p0*p2* p3=14400+45*40*25=14400+45000m13= m11+m23+p1*p2* p4=11250+8*40*10=11250+3200= m12+m33+p1*p3* p4=8000+8*25*10=10000m03= m00+m13+p0*p1* p4=10000+45*8*10=10000+3600=13600=

19、m01+m23+p0*p2* p4=14400+11250+45*40*10=m02+m33+p0*p3* p4=17000+45*25*10=17000+11250=28250这4个矩阵相乘需要的最小数量乘法的次数=13600最优计算次序A(BC)D)7-9给定字符串A=“xzyzzyx”和B=“zxyyzxz”,使用LCS算法求最长公共子串,并给出一个最长公共子串。提示:从上到下,从左往右计算C矩阵,依据C矩阵,求得最长公共子序列解:计算求得C矩阵如下, 依矩阵C可求得两个最长公共子序列分别为xyzz 和 zyyx (求一个即可)7-17设流水作业调度的实例为n=7,(a0, a1, a2

20、, a3, a4, a5, a6)=(6,2,4,1,7,4,7), (b0, b1, b2, b3, b4, b5, b6)=(3,9,3,8,1,5,6).请使用流水作业调度的Johnson算法求使完成时间最小的最优调度,并求该最小完成时间。提示:依据调度规则,求得最优调度次序解:;令mi=minai,bi 0=i7即得: m0=b0=3, m1=a1=2, m2=b2=3, m3=a3=1, m4=b4=1, m5=a5=4 m6=b6=6 考虑mi,对其从小到大排序得(m3,m4,m1,m0,m2,m5,m6) 考虑mi序列(如果序列中下一个数mi是ai,则作业i放在最左的空位,否则,

21、作业i放在最右的空位)得:最优调度顺序(3,1,5,6,2,0,4)依据最优调度在两台处理机上处理作业,最小完成时间:36(画出如教材P170的图7-17的形式即可求得最小完成时间36)8-2 #include #include int count=0;/记录可行解的个数/先将书中的递归变为如下非递归函数,再在输出一个可行解之后,加上break;int place(int k,int xk,int *x) for(int j=0;j=0) xk=xk+1; while (xkn & !place(k,xk,x)/找安置第K个皇后的合法位置 xk=xk+1; if(xkn)/找到安置第K个皇后合法的位置, if (k=n-1)/找到一个可行解,输出 coutThe solution is: ; for(int j=0;jn;j+)/找到一个可行解,输出 coutxj ; coutendl; / break;/删除,则可输出所有可行解。 count+; else /找到安

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1