相似度:最长公共子序列--LCS
一、概念
1、子序列
一个特定序列的子序列就是将给定序列中零个或多个元素去掉后得到的结果(不改变元素间相对次序)。如序列[A,B,C,B,D,A,B]的子序列有:[A,B],[B,C,A],[A,D,A,B]等.。
2、公共子序列
给定序列X和Y,序列Z是X的子序列,也是Y的子序列,则Z是X和Y的公共子序列。例如X=[A,B,C,B,D,A,B],Y=[B,D,C,A,B,A],那么序列Z=[B,C,A]为X和Y的公共子序列,其长度为3。
3.最长公共子序列
上述Z=[B,C,A]不是X和Y的最长公共子序列,存在序列[B,C,B,A]和[B,D,A,B]为X和Y的公共子序列,长度为4,因为X和Y不存在长度大于等于5的公共子序列,所以长度为4的公共子序列为最长公共子序列。
二、暴力枚举法
假设序列A有n个元素,序列B有m个元素,那么A、B分别有2^n,2^m个子序列,如果任意两个子序列一一比较,那么这时候的的算法复杂度为至少是2^(m+n),随序列长度指数增长,这对长序列是不适用的。
三、动态规划法
1、思想
假设存在序列A长度为M, 序列B长度为N,生成大小为(M+1)*(N+1)的矩阵dp, 初始元素全部为0
(1)Ax代表字符串A的前i个字符组成的序列,By代表字符串B的前j个字符组成的序列
(2)Ax[i]代表字符串A的第i个字符,i>0;By[j]代表字符串B的第j个字符,j>0;
(3)dp[i][j] 代表序列Ax与序列By的最长公共子序列的长度
解法如下:
1)如果Ax[i] = By[j],由于最长公共子序列为非连续序列,那么Ax和By的最长公共子序列LCS的最后一个元素即为当前元素,所以: dp[i][j]=dp[i-1][j-1]+1
即历史最长公共子序列的长度加1
2)如果Ax[i] != By[j],那么dp[i][j]的值存在两种情况:
情况一:可能是dp[i-1][j]的值,这代表字符串A的前i-1个元素与字符串B的前j个元素的最长公共子序列长度
情况二:可能是dp[i][j-1]的值,这代表字符串A的前i个元素与字符串B的前j-1个元素的最长公共子序列长度
两者取之间最大的值,即为当前dp[i][j]的值,即当前最长公共子序列的长度。
3)至此,重复上述计算方式直到矩阵dp最后一个值,即为字符串A与字符串B的最长公共子序列值。
2、实战
假设存在序列A = [A,B,C,B,D,A,B],序列B = [B,D,C,A,B,A],动态规划法求最长公共子序列可以用下图表示:
(1)设当前矩阵初始值均为0,由于i,j均大于0,忽略矩阵的第0行,及第0列
(2)从第i行,第1列开始计算,此时By[1] = B,
当i=1时,Ax[1] = A,两者不相等,取dp[i-1][j]与dp[i][j-1]两者之间最大的值,可知此时为0,
当i=2时,Ax[2] = B,两者相等,取dp[i-1][j-1]+1,可知此时应为0+1=1
当i=3时,以此类推
(3)重复上述步骤,最终得到最长子序列长度为4
相似度:最长公共子序列--LCS相关推荐
- 动态规划表格法解决最长公共子序列(LCS)问题
3.5 最长公共子序列(LCS) 前言:图片是博主自己画的,转载请注明出处哦 3.5.1 问题描述 最长公共子序列(Longest Common Subseuence,LCS)问题:给定两个字符串,求 ...
- 最长公共子序列 (LCS) 详解+例题模板(全)
欢迎访问https://blog.csdn.net/lxt_Lucia-- 宇宙第一小仙女\(^o^)/-萌量爆表求带飞=≡Σ((( つ^o^)つ~ dalao们点个关注呗- ------------ ...
- 最长公共子序列 - LCS
最长公共子序列 - LCS 问题描述 子序列定义 子串定义 公共子序列定义 最长公共子序列(以下简称LCS) 动态规划解决 子问题划分及依赖关系 递推公式 伪代码 代码实现 复杂度分析 问题描述 子序 ...
- 动态规划算法解最长公共子序列LCS问题
动态规划算法解LCS问题 作者 July 二零一零年十二月三十一日 本文参考:微软面试100题系列V0.1版第19.56题.算法导论.维基百科. 第一部分.什么是动态规划算法 ok,咱们先来了解下什么 ...
- 动态规划之最长公共子序列(LCS)
最长公共子序列(LCS,Longest Common Subsequence).其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最 ...
- 程序员编程艺术第十一章:最长公共子序列(LCS)问题
程序员编程艺术第十一章:最长公共子序列(LCS)问题 0.前言 程序员编程艺术系列重新开始创作了(前十章,请参考程序员编程艺术第一~十章集锦与总结).回顾之前的前十章,有些代码是值得商榷的,因当时的代 ...
- 算法之最长公共子序列(LCS)问题
算法课上老师留的作业,最长公共子序列LCS(Longest Common Subsequence)问题,首先看到这个问题感觉有点复杂,和最长公共子串不同,公共子序列并不要求元素相邻,看起来只有穷举才能 ...
- 最长公共子序列php,动态规划(最长公共子序列LCS)
概念 求解决策过程最优化的结果 (可能有多个) 把多阶段过程转化为一系列单阶段过程,利用各阶段之间的关系,逐个求解 计算过程中会把结果都记录下,最终结果在记录中找到. 举例 求两个字符串的最长公共子序 ...
- python实现求解最长公共子序列LCS问题
在实现论文<Automatically Generating Models for Botnet Detection>论文的算法中,用到了一个The longest commom subs ...
最新文章
- 程序设计基本概念(2)-2.19
- 赛灵思FPGA中的主要时钟资源介绍
- Apache配置--用户认证(针对目录访问)-update2015-05-02
- Linux2.6 内核进程调度分析
- 替代java参数_java – 使用Void作为可选参数的更好的替代方法
- 找呀志_ContentResolver操作ContentProvider数据
- 大数据可视化设计到底是啥,该怎么用
- c++画多边形_如何画出超漂亮的极光绘画教程
- 我的docker随笔26:制作arm平台的python-pandas镜像
- p41_数据报与虚电路
- 【转】js获取浏览器信息和客户端硬件信息
- JDBC批处理---(java 对数据库的回滚) .
- SharePoint Framework 企业向导(二)
- python输出unicode字符_如何在Python中打印Unicode字符?
- sqlserver、mysql删除重复数据
- 使用pktgen-dpdk和l2fwd测试RFC2544
- magick++配置
- 分享一批常用的软件(已存网盘),中文Pycharm、MySQL、各类工具(截图、录屏、护眼····)...
- QQ空间说说如何批量删除
- 稀疏矩阵存储格式总结+存储效率对比:COO,CSR,DIA,ELL,HYB