《算法设计与分析》实验指导书.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
算法设计与分析 实验指导书 邵阳学院信息工程系 2010年3月 实验1 最大子段和(分治法) 一、实验内容 运用分治法,编制程序求解如下问题: 给定由n个整数(可能有负整数)组成的序列(a1,a2,…,an),最大子段和问题要求该序列形如的最大值(1 i j n),当序列中所有整数均为负整数时,其最大子段和为0。 二、实验要求 1.进一步掌握递归算法的设计思想以及递归程序的调式技术; 2.理解这样一个观点,分治与递归经常同时应用在算法设计之中。 三、主要仪器设备 装有TC或Visual C++的PC机 四、实验步骤 1.算法分析 最大子段和问题的分治策略是: (1)划分:按照平衡子问题的原则,将序列 a1, a2, …, an 划分成长度相同的两个子序列 a1, …, an/2 和 an/2+1, …, an ,则会出现以下三种情况: ① a1, …, an的最大子段和=a1, …, an/2的最大子段和; ② a1, …, an的最大子段和=an/2+1, …, a的最大子段和; ③ a1, …, an的最大子段和=,且 (2)求解子问题:对于划分阶段的情况①和②可递归求解,情况③需要分别计算: , 则s1+s2为情况③的最大子段和。 (3)合并:比较在划分阶段的三种情况下的最大子段和,取三者之中的较大者为原问题的解。 分析算法的时间性能,对应划分得到的情况①和②,需要分别递归求解,对应情况③,需要两个并列for循环,时间复杂性是O n ,所以,存在如下递推式: 时间复杂性为O nlogn 。 2.参考代码 #include int MaxSum int a[], int left, int right int sum 0, leftsum 0, rightsum 0; int center, i, j; int s1, s2, lefts, rights; if left right //如果序列长度为1,直接求解 if a[left] 0 sum a[left]; else sum 0; else center left+right /2; //划分 //对应情况①,递归求解 leftsum MaxSum a, left, center ; //对应情况②,递归求解 rightsum MaxSum a, center+1, right ; //以下对应情况③,先求解s1 s1 0; lefts 0; for i center; i left; i-- lefts+ a[i]; if lefts s1 s1 lefts; //再求解s2 s2 0; rights 0; for j center+1; j right; j++ rights+ a[j]; if rights s2 s2 rights; sum s1+s2; //计算情况③的最大子段和 //合并,在sum、leftsum和rightsum中取较大者 if sum leftsum sum leftsum; if sum rightsum sum rightsum; return sum; int main int a[] -20, 11, -4, 13, -5, -2 ; int left 0, right 5; cout MaxSum a, left, right endl; return 0; 实验2 最长公共子序列问题 一、实验内容 利用动态规划算法编制程序求解下面的问题: 若给定序列X x1,x2,…,xm ,则另一序列Z z1,z2,…,zk ,是X的子序列是指存在一个严格递增下标序列 i1,i2,…,ik 使得对于所有j 1,2,…,k有:zj xij。例如,序列Z B,C,D,B 是序列X A,B,C,B,D,A,B 的子序列,相应的递增下标序列为 2,3,5,7 。给定2个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X和Y的公共子序列。给定2个序列X x1,x2,…,xm 和Y y1,y2,…,yn ,找出X和Y的最长公共子序列。 二、实验要求 1.熟悉最长公共子序列问题的算法; 2.初步掌握动态规划算法。 三、主要仪器设备 装有TC或Visual C++的PC机 四、实验步骤 1.算法分析 最长公共子序列问题具有最优子结构性质。设X x1 , ... , xm ,Y y1 , ... , yn ,及它们的最长子序列Z z1 , ... , zk ,则: (1)若xm yn,则zk xm yn,且Z[k-1]是X[m-1]和Y[n-1]的最长公共子序列 (2)若xm ! yn,且zk

文档评论(0)

lingyun51 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档