(尚未完工)论文阅读:An O ND Difference Algorithm and Its Variations
最近阅读了这篇论文,虽然是一篇很老的论文(1986),但是其算法思想及其改进的效果很好,简要记录防止忘记。
摘要
这篇博客讲述了O(ND)论文的算法的原理,论文算法存在的问题,然后将这个算法应用到DNA序列比对的算法中,计算两条相似序列的最短编辑距离,并且与常规DP算法进行时间比较。发现O(ND)算法在序列相似时,时间消耗明显优于DP算法。所以O(ND)算法在计算长片段相似DNA的两条序列时有着极大优势。
理论
该部分讲述leetcode原题,常规算法,论文中各种概念的定义,以及论文的算法
最长公共子串与最短编辑脚本
最长公共子串问题(LCS)和最短编辑脚本(SES)(链接为leetcode原题)
SES问题描述如下:
给定两个字符串A、B,我们可以对任意一个字符串做三种操作:
- 插入一个字符
- 删除一个字符
- 替换一个字符
求:将A变成B的最少操作次数(最短编辑距离)和操作方法(最短编辑脚本)
LCS问题描述如下:
给定两个字符串A、B,
定义
子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串**
求这两个字符串的最长公共子序列的长度
常规算法
这两道题常规的解法就是动态规划(dp),常规解法leetcode中已经描述的很详细了,这里就不再赘述。
常规算法存在的问题
动态规划算法的时间复杂度为O(MN)空间复杂度也为O(MN)复杂度太高,如果对于两个很长的字符串,CPU和内存消耗是很大的。
常规算法中可以优化的点如下:
- 常规算法的字符集可以是任意的、无限的,而实际应用中遇到的字符集往往是有限的
例如:
大写英文字母字符集大小为26(A~Z)
阿拉伯数字字符集大小为10(0~9)
DNA碱基字符集大小为4(A、G、C、T)- 常规算法的两个字符串差异可以特别大,而实际应用中两个字符串的差异可能很小
编辑图及相关定义
为了与论文中的字母对应,在这里进行定义:
N=len(A)
M=len(B)
D=len(最短编辑脚本)
L=len(最长公共字串)
其中M,N为已知,D,L为待求。
下图是论文中的edit graph图
其中
字符串A=abcabba,N=7
字符串B=cbabac,M=6
如果字符串A中的某一字符Ai与字符串B的Bj相同,那么在这个编辑图中会多一条点(Ai-1,Bj-1)到(Ai,Bj)的对角线
现在问题演变成了:
如何在编辑图上找到一条(0,0)到(n,m)的最短路径
路径中如果包含
- 水平边,则表示字符串A删除一个字母
- 垂直边,则表示字符串A插入一个字母
- 对角线,则表示不做任何操作
注意这里的操作只有插入和删除,没有替换。
论文算法
diagonal k,D-path,snake的定义
推论1
推论2
简略版算法
详细算法
论文算法存在的问题
将3种操作中的替换操作视为了一个插入加一个删除,其实是将三种操作赋予了不同的权重