论文地址
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