Myers差分算法分析

本文介绍了Myers差分算法,用于找出两个序列的最短编辑距离。算法基于编辑图,通过动态规划解决从A到B的最短路径问题。算法以O(ND)的时间和空间复杂度找到最长公共子序列,并解释了snake、k line和d contour等关键概念,以及贪婪算法的应用。
摘要由CSDN通过智能技术生成

论文地址

paper论文地址: https://neil.fraser.name/writing/diff/myers.pdf

摘要

对于两个序列A、B,寻找其最长公共子序列的问题与寻找其最短编辑过程(从A到B)的问题一直被认为是一对对偶问题。
本文证明了它们等价于在一个编辑图中找到最短/最长路径。
基于这个观点,我们找到了一个简单的O(ND)时间与空间复杂度的算法,其中N为A与B的长度和,D为AB间最短编辑过程的长度

定义

在这里插入图片描述

编辑图

本文使用与论文相同的示例。
文件A包含 ABCABBA,文件B包含CBABAC。
这些被表示为两个字符数组:A []和B []。
A []的长度为N,B []的长度为M。

我们就可以求解从A数组变成B数组的问题,转换成为求解从A字符串变成B字符串的问题。
在这里插入图片描述

解决方案

解决问题:从左上角(0,0)到右下角(7,6)的最短路径。

动态规划解决方案
当一个问题
(1)依赖于子问题的最优解
(2)子问题重叠
(3)问题存在边界
(4)子问题独立
就可以考虑使用动态规划来解决。

该问题中,点(n,m)的最优解依赖于(n,m-1),(n-1,m)两个点所在对角线上所有能够走一步到达(n,m)的点。可以使用动态规划求解。

Myers差分解决方案:

数组A沿x轴放在顶部。数组B沿y轴向下放置。

始终可以水平或垂直移动一个字符。
水平(右)移动表示从文件A中删除,垂直(向下)移动表示在文件B中插入。
如果存在匹配的字符,则还可以对角移动,以匹配结束。
解决方案是尽量走对角边让操作变得最少,目的是走到右下角。只要 A[i] == B[j] 那么 (i,j) 就可以从 (i-1, j-1) 走过来,否则只能从 (i-1, j) 或者 (i, j-1) 走过来,所以一碰上 A[i] == B[j] 的话,就存在了一条斜边。

LCS是轨迹中的对角线,SES是轨迹中的水平和垂直移动。例如,LCS的长度为4个字符,SES的长度为5个差异。
在这里插入图片描述

概念

根据 Myers 的论文,他提出了三个概念:

snake : 一条snake代表走一步。例如从(0,0)->(0,1) / (0,0)->(1,0) / (0,1)->(0,2)->(2,4) 这分别为三条snake,走对角线不计入步数。

k line: 定义 k = x - y (好吧,我习惯写成 y = x - k,这是相同斜率的平行斜线组成的一个集合)

d contour: 走一步算一个 d

贪婪算法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值