算法学习心得——动态规划法实现最长公共子序列(LCS)

本文详细介绍了动态规划法求解最长公共子序列(LCS)问题,探讨了LCS的定义、动态规划法的核心思想以及算法实现。通过Java代码展示了算法过程,并进行了实验分析,证明了算法的时间复杂度与理论分析相符。
摘要由CSDN通过智能技术生成

算法学习心得——动态规划法实现最长公共子序列(LCS)

一.问题说明

欲定义最长公共子序列(Longest Common Subsequence)问题,首先需要引入两个辅助性的概念,即:子序列的概念和公共子序列的概念。

    子序列的概念形式化为:设X = <x1, x2,┅, xm>,若有1≤i1< i2< ┅ <ik≤m,使得Z=< z1,z2,┅, zk> = < xi1, xi2,┅, xik>,则称Z是X的子序列,记为Z<X。举例来说明,比如:X=<A,B,C,B,D,A,B>, Z=<B,C,B,A>,  则有Z<X。

    然后介绍公共子序列的概念:设X,Y是两个序列,且有Z<X和Z<Y,则称Z是X和Y 的公共子序列。

    理解了子序列的概念和公共子序列的概念,那么就可以来解释最长公共子序列的概念了。若:若Z<X,Z<Y,且不存在比Z更长的X和Y 的公共子序列,则称Z是X和Y 的最长公共子序列,记为ZÎLCS(X , Y)。通俗易懂地讲就是一个序列S,若分别是两个或者多个已知序列的子序列,并且序列S是所有符合条件的子序列中最长的,那么就可以称S为已知的最长公共子序列。

    然而对于最长公共子序列的理解通常会有两种观点:第一种观点认为通过动态规划法求得的最长公共子序列有连续性质的要求,即所求的最长公共子序列只能由原序列中连续出现的若干个元素组成;第二种观点则认为对最长公共子序列没有连续性质的要求,即最长公共子序列是由原序列中的若干个元素所组成的,这些元素只需要满足最基本的相对顺序即可。本文中所介绍的最长公共子序列则是基于第二种观点。

   针对最长公共子序列问题的研究是因为有其重要性的应用领域,最长公共子序列主要用于生物信息学中DNA序列的比较。由于DNA序列非常庞大,比较两个或者若干个DNA序列的相似度就需要用到最长公共子序列。而且最长公共子序列也可以用于其他方面:比如比较两段文字或者两篇文章之间的相似程度,从而来辨别他们之间是否存在抄袭关系。

二.动态规划法介绍

由于最长公共子序列算法是基于动态规划法实现的,因此有必要介绍下动态规划法。说起动态规划法,顾名思义就是将原问题一层一层地分解为规模逐渐减小的同类型的子问题。而这些子问题往往具有高度重复性,基于子问题的高度重复性,动态规划法一般采用递推的方式,从规模最小的子问题开始依次计算规模逐渐增大的子问题。为了避免重复计算,通常是每次计算完后就把所得的结果保存起来。因此当再次遇到子问题时可以直接使用已经保存的结果,无须重新计算。

然而并不是所有的问题都适合动态规划法,只有当一个问题的子问题具有高度重复性,同时满足最优子结构(即:问题的最优解中包含着其每一个子问题的最优解)性质时,才能使用动态规划法求解。

三.最长公共子序列算法思想

清楚了最长公共子序列的概念,了解了动态规划法的精髓,那么现在可以来研究最长公共子序列算法的主要思想了。最长公共子序列问题属于多阶段决策问题中求最优解的一类问题。解决这类问题最直接的办法就是使用穷举法:列出所有长度不超过原序列的子序列,从长到短依次进行检查,看哪个序列满足条件。但是这种解法的时间复杂度往往是趋向去指数级别的,这

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值