算法设计工作方案最长公子序列.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文档。上传文档
查看更多
算法设计工作方案最长公子序列

最长公共子序列(LCS)算法 算法要求及分析 1. 算法要求:利用b[i,j],设计一个算法求出全部的LCS;利用”会计方法”,分析所编算法的时间复杂度的最坏情况。 2. 算法分析:该部分思路同课件 算法详细设计 为了求出全部的LCS,需要设计两个功能函数:LCS_L和LCS_Output,函数LCS_L实现计算LCS长度及每个子问题的由来;函数LCS_Output用递归方法实现输出所有LCS。 具体设计实现思路: 声明全局变量 二维动态数组C和b。数组C记录所要求的LCS的长度;数组b记录C[i,j]是通过哪一个子问题的值求得的。定义枚举类型记录不同的遍历方向。 用动态规划法实现功能函数LCS_L,得出数组C和b。 函数实现思路:首先动态分配和初始化二维数组C和b,然后计算出C和b。 根据X[i]和Y[j]的关系,计算得出C[i,j]: ?若X[i]=Y[j],则执行C[i,j]←C[i-1,j-1]+1且b[i][j]=ual; ?若X[i]!=Y[j],则分为三种情况: 若C[i-1,j]C[i,j-1]则C[i,j]取C[i-1,j]且b[i][j]=up。 若C[i-1,j]C[i,j-1]则C[i,j]取C[i,j-1]且b[i][j]=le。 若C[i-1,j]=C[i,j-1]则C[i,j]取C[i-1,j]且b[i][j]=uol。 根据C和b编写输出函数LCS_Output输出所有的LCS。函数实现思路: 设置变量cur_len记录当前的数组下标,变量len保存当前LCS数组的元素个数。依次扫描二维数组b,从最后一个开始,根据b的值来判断递归方向: 当b的值是ual时,LCS数组保存当前字符,len++,沿对角线递归(递归完成要回溯);len等于LCS的长度时即找到一个LCS序列并输出; 当b的值是up时,向上递归; 当b的值是le时,向左递归; 当b的值是uol时,要找出所有的LCS,故既要向左也要向上递归。 主函数给出不同的测试数据输出相应的最长公共子序列长度和所有的最长公共子序列。 算法流程图 开始 功能函数LCS_L详细流程图 开始 开始 动态分配二维数组 动态分配二维数组C和b 定义int型变量i,j 初始化数组 初始化数组C的第0行和第0列 i m ? i m ? N j n ? Y N j n ? 比较两个序列的当前字符是否相等? Y 比较两个序列的当前字符是否相等? Y C[i][j]= C[i-1][j-1]+1。b[i][j] = ual。C[i-1][j] 与 C[i][j]= C[i-1][j-1]+1。 b[i][j] = ual。 C[i-1][j] 与C[i][j-1]的关系? 大于 等于 小于 C[i][j] = C[i][j-1]。 C[i][j] = C[i][j-1]。 b[i][j] = le。 C[i][j] = C[i-1][j]。 b[i][j] = uol。 C[i][j] = C[i-1][j]。 b[i][j] = up。 结束 结束 功能函数LCS_Output详细流程图开始 开始 i =0 j=0? i =0 j=0? N Y len当前值等于LCS的长度 ? len当前值等于LCS的长度 ? 输出一个LCSY 输出一个LCS N b[i][j] == ual ? Y b[i][j] == ual ? 记录当前值;利用回溯方法,使i-1,j-1递归功能函数LCS_Output; 记录当前值; 利用回溯方法,使i-1,j-1递归功能函数LCS_Output; N b[i][j] == up ? Y b[i][j] == up ? 使i-1递归调用功能函数LCS_Output; 使i-1递归调用功能函数LCS_Output; b[i][j] == le ? N b[i][j] == le ? 使j-1递归调用功能函数LCS_Output;Y 使j-1递归调用功能函数LCS_Output; N 使i-1递归函数LCS_Output; 使i-1递归函数LCS_Output; 使j-1递归函数LCS_Output; 结束 测试结果 通过四组数据(见程序)测试均得到正确结果,截图如下: 分析和总结 结果分析: 第一组数据为课件上的例题,结果正确; 第二组数据为无最长公共子序列例题,结果正确; 第三组数据为较长较多的公共子序列例题,结果正确; 第四组数据为一个但多次有重复的最长公共子序列例题,结果正确。 时间复杂度分析: 显然用于求解出数组C和b的功能函数LCS_L时间复杂度O(m

文档评论(0)

盼储储time + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档