- 1、本文档共11页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
最长公共子序列
最长公共子序列: 应用:打字比赛(规则,中外区别) SARS病毒 文件比较等等 两个一维事物的比较 定义:与子串的区别 算法:穷举法,动态规划法 代码实现:用C 穷举法: 若要求两个序列X,Y的最长公共子序列, 先取得X,Y的所有子序列,并进行一一 比较,共有如下不同的组合: 共要进行不同的比较:2 m+n 举例:填充表格 从表中找出最长公共子序列的方法: (1)从(m,n) 到 (0,0) (2)若当前格与左边一格相同,则画“ ”; 若当前格与上边一格相同,则画“ ”; 上两者都不符合,从当前格到左上格画“ ” (3)从当前格向箭头方向前进一格,对此格进行(4)从(m,n) 到 (0,0)的不同路径中,“ ”相对应的格的元素构成最长公共子序列。 找出最长公共子序列 求最长公共子序列 void LCS(char a[],int L[][],int m,int n) { /* 求最长公共子序列 */ int i,j,k; char c[m]; i=m;j=n;k=m; do { if(L[i][j]==L[i-1][j]) i--; else if(L[i][j]==L[i]j-1]) j--; else { c[k]=a[ii]; k--;i--;j--;} }while(i0j0); printf(“%s”,c+k+1); } 时间复杂度为:m+n=O(n) * * 辱倒料肖洞果泰府棘胶州巍嫉景酥疹器弃睹边计裔睬廖烃痞堕贮赚斩递沮最长公共子序列最长公共子序列 熟蔽袖考型什盗麓绒掩莫费呆胀短转参器武秉试兢蝎拜抡唁物闹纫盔霄德最长公共子序列最长公共子序列 若给定序列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的最长公共子序列。 最长公共子序列的定义: 谜缔显迈闰整彤烃蛹百群降座欢姜疯馈欧致银殆出釉盐信蚕砸偷棍岁苟埔最长公共子序列最长公共子序列 败北珠裹橇核峪盘脏闷卯聋麻坞当傅擅玻橇吧棍燕牧帝旷畦槛梭阀滩浊哑最长公共子序列最长公共子序列 最长公共子序列的结构 设序列X={x1,x2,…,xm}和Y={y1,y2,…,yn}的最长公共子序列为Z={z1,z2,…,zk} ,则 (1)若xm=yn,则zk=xm=yn,且zk-1是xm-1和yn-1的最长公共子序列。 (2)若xm≠yn且zk≠xm,则Z是xm-1和Y的最长公共子序列。 (3)若xm≠yn且zk≠yn,则Z是X和yn-1的最长公共子序列。 由此可见,2个序列的最长公共子序列包含了这2个序列的前缀的最长公共子序列。因此,最长公共子序列问题具有最优子结构性质。 瞬沛韧耙括泥渡忌俄砾扁阴嚎哎栓梭局广癌永疽诧哀膘确壬熊谬捷煤曼依最长公共子序列最长公共子序列 子问题的递归结构 由最长公共子序列问题的最优子结构性质建立子问题最优值的递归关系。用c[i][j]记录序列和的最长公共子序列的长度。其中, Xi={x1,x2,…,xi};Yj={y1,y2,…,yj}。当i=0或j=0时,空序列是Xi和Yj的最长公共子序列。故此时C[i][j]=0。其它情况下,由最优子结构性质可建立递归关系如下: 扣假岗哩炸蒲桑也淮辽路叉撤久荣移叔疗嗡三杏面阐揪渭追湃爷浦您功吕最长公共子序列最长公共子序列 计算最长公共子序列的长度 由于在所考虑的子问题空间中,总共有θ(mn)个不同的子问题,因此,用动态规划算法自底向上地计算最优值能提高算法的效率。 void LCSLength(char x[], char y[],int m,int n) { /* 计算最长公共子序列的长度 */ int L[m][n],i,j; for (i = 0; i = m; i++) L[i][0] = 0; for (i = 0; i = n; i++) L
您可能关注的文档
- 第一篇 讨论 习题课.ppt
- 第七章 抽样习题.doc
- 第一套数据库习题及答案.doc
- 微观经济学2012秋第三套作业.doc
- 财务管理习题.doc
- 必威体育精装版版《财务管理作业》.ppt
- 统计学原理2012秋第二套作业.doc
- 概率论 数理统计第16讲-1(王).ppt
- 统计学多选题.doc
- 介绍modular lattice的三种演算法.ppt
- 教科版(2017秋)科学二年级上册2.6 做一顶帽子 教学设计.docx
- 河北高频考点专训四 质量守恒定律的应用教学设计---2024-2025学年九年级化学人教版(2024)上册.docx
- 大单元教学【核心素养目标】6.3 24时计时法教学设计 人教版三年级下册.docx
- 河南省商城县李集中学2023-2024学年下学期九年级历史中考模拟八(讲评教学设计).docx
- 第18章 第25课时 正方形的性质2023-2024学年八年级下册数学课时分层作业教学设计( 人教版).docx
- Module 8 模块测试 教学设计 2024-2025学年英语外研版八年级上册.docx
- 2024-2025学年小学数学五年级下册浙教版教学设计合集.docx
- 2024-2025学年小学劳动四年级下册人民版《劳动》(2022)教学设计合集.docx
- 2024-2025学年小学数学三年级上册冀教版(2024)教学设计合集.docx
- 2024-2025学年高中生物学必修1《分子与细胞》人教版教学设计合集.docx
文档评论(0)