最长公共子序列和编辑距离

1.文章相似度 小新大学毕业了,但是老师想要知道他的毕业论文有没有抄袭。如果我们 想要了解两篇文章是否相似,我们可以采取哪些方法呢? 大家思考一下? 2.公共子序列LCS 这里引入一个方法,如果两篇文章,公共子序列的长度越大,说明越相似。 公共子序列:给定2个序列X和Y,当另一序列Z既是X的子序列又是Y的子序 列时,称Z是序列X和Y的公共子序列。 最长公共子序列:给定2个序列X = {x1, x2,…,xm }和Y= {y1, y2,…,yn },找出X 和Y的最长公共子序列. 如:序列ABCDEF和ADFGH的最长公共子序列为ADF 3.公共子序列和公共子串区别 最长公共子串(Longest Common Substirng)和最长公共子序列 (Longest Common Subsequence,简称LCS)的区别是最长公共子串的串是 一个连续的部分,而最长公共子序列则是从不改变序列的顺序,而从序列中去 掉任意的元素而获得新的序列;通俗的说就是子串中字符的位置必须是连续 的而子序列则可以不必连续。 4.公共子序列的解法 S1={1,3,4,5,6,7,7,8}和S2={3,5,7,4,8,6,7,8,2}) 我们怎么进行分类讨论呢? 假如S1的最后一个元素 与 S2的最后一个元素相等,那么S1和S2的LCS 就等于 {S1减去最后一个元素} 与 {S2减去最后一个元素} 的 LCS 再加上 S1和S2相等的最后一个元素。 假如S1的最后一个元素 与 S2的最后一个元素不等(本例子就是属于这 种情况),那么S1和S2的LCS就等于 : {S1减去最后一个元素} 与 S2 的LCS, {S2减去最后一个元素} 与 S1 的LCS 中的最大的那个序列。 所以我们能推出状态转移方程了: 就像背包问题一样,我们详细看看推导中间过程: 例1:3919: 最长公共子序列(一) 题目描述 最长公共子序列(LCS)是一个在一个 序列集合中(通常为两个序列)用来查 找所有序列中最长子序列的问题。一个 数列 ,如果分别是两个或多个已知数列 的子序列,且是所有符合此条件序列中 最长的,则称为已知序列的最长公共子 序列。 02章 构造LCS 本文S1和S2的最LCS并不是只有1个,本文并不是着重讲输出两个序列的所有LCS, 只是介绍如何通过上表,输出其中一个LCS。 我们根据递归公式构建了上表,我们将从最后一个元素c[8][9]倒推出S1和S2的LCS。 c[8][9] = 5,且S1[8] != S2[9],所以倒推回去,c[8][9]的值来源于c[8][8]的值(因为 c[8][8] > c[7][9])。 c[8][8] = 5, 且S1[8] = S2[8], 所以倒推回去,c[8][8]的值来源于c[7][7]。 以此类推,如果遇到S1[i] != S2[j] ,且c[i-1][j] = c[i][j-1] 这种存在分支的情况,这里请 都选择一个方向(之后遇到这样的情况,也选择相同的方向)。 这就是倒推回去的路径,棕色方格为 相等元素,即LCS = {3,4,6,7,8},这是其 中一个结果。 如果如果遇到S1[i] != S2[j] ,且 c[i-1][j] = c[i][j-1] 这种存在分支的情况, 选择另一个方向,会得到另一个结果。 即LCS ={3,5,7,7,8}。 构建c[i][j]表需要Θ(mn),输出1个 LCS的序列需要Θ(m+n)。 我们通过搜索逆序回去就可以找到对应的所有的公共子序列了。 例1:1840: 最长公共子序列(二) 题目描述 若给定序列X = {x1, x2,…,xm },则另一 序列Z= {z1, z2,…,z k },是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}。 03章 LCS问题的 优化 当序列a中的元素都互不相同的时候,LCS存在一种优化方案,即将其转化为LIS问题 求解,而LIS问题可以优化到O(nlogn)的时间复杂度内解决(最长上升子序列(LIS) 问题的解决及优化)。那么如何将LCS问题转化为LIS呢,我们进行如下分析: 我们对序列a中的元素按其下标进行标号,因为a中的元素都互不相同,所以每个元素 的标号都是唯一的且递增的。而最长公共子序列它属于a的子序列,那么它的元素的标 号也是递增的,同时它也属于b的子序列,反过来说也就是当b的某个子序列按a的标 号方式呈递增的时候,它也属于a的子序列,即它是a、b的公共子序列。我们可以对b 中的元素按a的标号方式标号,剩下的就是从里面寻找递增子序列,又要找最长的那个 ,那问题就变成了最长上升子序列即LIS问题。 例:a:6 4 8 1 3 2 ,b:4 7 6 2 3 8 1 标号为: 1 2 3 4 5 6, 则序列b变为:2 0 1 6 5 3 4 其中只要是0 就跳过 标号后的b序列的最长上升子序列为:1 3 4,2 3 4 对应在序列a中得到最长公共子序列为:6 8 1,4 8 1 这样时间复杂度,就变成了 O(n*log n) 但是这种办法没有很好回溯,求出具体的最长公共子序列。 例1:5229: 最长公共子序列(三) 题目描述 最长公共子序列(LCS)是一个在一个 序列集合中(通常为两个序列)用来查 找所有序列中最长子序列的问题。一个 数列 ,如果分别是两个或多个已知数列 的子序列,且是所有符合此条件序列中 最长的,则称为已知序列的最长公共子 序列。 04章 编辑距离 1.文章相似度 我们是不是可以这样考虑文章相似度的问题: 看两个文本,如果第二个文本修改成第一个文本,他的修改次数,如果少, 说明两篇文章更为相似。 这种以修改来判断文章次数来判断相似程度的,我们称这种修改次数是编 辑距离。 2.编辑距离 编辑距离,也叫莱文斯坦距离(Levenshtein),是针对二个字符串(例如英 文字)的差异程度的量化量测,通过增加,删除和修改。量测方式是看至少 需要多少次的处理才能将一个字符串变成另一个字符串。 有一个字符串 a='love',b='lolpe'.那么计算a和b的编辑距离,就是要算出 从a变化到 b需要经过多少个步骤。 1.love->lolve(插入l) 2.lolve->lolpe(用v替换成p) 那么我们就说他们的编辑距离为2 我们来用动态规划的思路来试试: 首先是状态的意义。 和公共子序列一样,状态是二维,dp[i][j] 代表了 a前面i长度的字符串变 成b前面j长度的字符串需要多少次。 那么再分类讨论: 如果最后一个字母,a[i]和b[j]相同的话 dp[i][j]事实上等于dp[i-1][j-1],最后一个字母不会动。 如果不一样又可以分为替换,删除,增加3个类。 3.编辑距离 公式定义: i和j分别表示字符串a和字符串b的下标。下标从1开始 4.代码: for(int i=1;i<=a.size()-1;i++){ for(int j=1;j<=b.size()-1;j++){ if(a[i]==b[j]) dp[i][j]=dp[i-1][j-1]; else dp[i][j]=min(dp[i-1][j-1]+1,min(dp[i-1][j]+1,dp[i][j-1]+1)); cout<

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值