最长公共子序列(LCS问题)

本文介绍了最长公共子序列(LCS)问题,探讨了其在生物DNA近似度检测中的应用。通过动态规划避免了指数级的时间复杂度,提出四个步骤来解决LCS问题:描述最优解结构、递归定义最优解值、计算最优解值、构造最优解。文章还给出了计算LCS长度的伪代码及C语言实现,展示了动态规划在解决此类问题中的高效性。
摘要由CSDN通过智能技术生成

先简单介绍下什么是最长公共子序列问题,其实问题很直白,假设两个序列X,Y,X的值是ACBDDCB,Y的值是BBDC,那么XY的最长公共子序列就是BDC。这里解决的问题就是需要一种算法可以快速的计算出这个最大的子序列,当然,用最简单的方法就是列出XY全部的子系列然后一个个对比,但这样的时间复杂度是绝对不能接受的。假设X的长度是m,Y的长度是n,拿X的一个子序列和Y进行对比的时间是n,计算X的全部子序列的时间是2^m,所以,如果采用的是一个个全部计算的话,将会花费n*2^m的时间,指数级别的时间复杂度是爆炸式的。我们这里解决的方法是采用动态规划的方式,所以再讲问题之前,先简单提下动态规划的概念。

动态规划

动态规划是通过组合子问题的解而解决整个问题的,说到这里,是不是有些熟悉?在先前的归并排序中采用的分治法其实也是对子问题进行分析,但有所不同的是,分治法的思想是通过将问题分解为多个子问题,然后一一解决,最后合并子问题就得到了原问题的答案。当然,分治法所适用的领域就是子问题没有相互的关联,而动态规划所就没那么简单了,它的子问题一般都是由相互关联的情况,也就是说子问题包含了公共的子子问题。什么叫公共的子子问题,就是一个子问题继续分解,另一个子问题也继续分解,然后它们惊讶的发现它们分解出来的问题竟然是一样的。所以假设使用分治法来计算这种问题的话,就会产生许多不必要的重复计算,而动态规划的目标之一就是去除这种重复的计算,而方法就是讲结果放在一张表中,具体的怎么弄可以详细看最长公共子序列问题怎么解的。

动态规划常常用于最优解问题,具体的设计可以参考下面的部分:

1.描述最优解的结构

2.递归定义最优解的值

3.按自底向上的方式计算最优解的值

4.由计算结果构造一个最优解

这几个步骤等等就会被用于求解最长公共子序列的问题上,具体步骤请对号入座。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值