《算法导论》实验二:最长公共子序列(LCS)算法

本文详细介绍了最长公共子序列(LCS)算法,包括算法设计与分析、动态规划解决方案,并提供了C++核心代码。通过实验展示了在DNA序列上的应用,总结了算法性能特点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最长公共子序列(LCS)算法


  • 一、题目描述
  • 二、算法设计与分析
  • 三、核心代码
  • 四、实验结果
  • 五、总结
  • 六、附录(C++源代码)

一、题目描述

子序列定义:X=(x1,x2,····,xm),序列Z=(z1,z2,····,zk)是X的一子序列,必须满足:若X的索引中存在一个严格增的序列i1,i2,····,ik,使得对所有的j=1~k,均有xij=zj。
两个序列的公共子序列:Z是X和Y的子序列,则Z是两者的公共子序列CS。
最长公共子序列(LCS):在X和Y的CS中,长度最大者为一个最长公共子序列LCS。

实验环境:

CPU:奔腾 T4300
内存:4G
操作系统:Windows7 ;
软件平台:VS2010

二、算法设计与分析

1、算法思想:因为LCS问题满足最优子结构和重叠子区间,所以可用动态规划的方法来设计算法。
2、LCS的最优子结构性质:
设序列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的最长公共子序列。
其中Xm-1=(x1, x2, …, xm-1),Yn-1=(y1, y2, …, yn-1),Zk-1=(z1, z2, …, zk-1)。
两个序列的最长公共子序列包含了这两个序列的前缀的最长公共子序列。因此,最长公共子序列问题具有最优子结构性质。
3、子问题的递归结构:
由最长公共子序列问题的最优子结构性质可知,要找出X=(x1, x2, …, xm)和Y=(y1, y2, …, yn)的最长公共子序列,可按以下方式递归地进行:当xm=yn时,找出Xm-1和Yn-1的最长公共子序列,然后在其尾部加上xm(=yn)即可得X和Y的一个最长公共子序列。当xm≠yn时,必须解两个子问题,即找出Xm-1和Y的一个最长公共子序列及X和Yn-1的一个最长公共子序列。这两个公共子序列中较长者即为X和Y的一个最长公共子序列。
由此递归结构容易看到最长公共子序列问题具有子问题重叠性质。例如,在计算X和Y的最长公共子序列时,可能要计算出X和Yn-1及Xm-1和Y的最长公共子序列。而这两个子问题都包含一个公共子问题,即计算Xm-1和Yn-1的最长公共子序列。
与矩阵连乘积最优计算次序问题类似,我们来建立子问题的最优值的递归关系。用c[i,j]记录序列Xi和Yj的最长公共子序列的长度。其中X

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值