最近阅读了这篇论文,虽然是一篇很老的论文(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)的对角线
论文阅读:An O(ND) Difference Algorithm and Its Variations
现在问题演变成了:

如何在编辑图上找到一条(0,0)到(n,m)的最短路径
路径中如果包含

  • 水平边,则表示字符串A删除一个字母
  • 垂直边,则表示字符串A插入一个字母
  • 对角线,则表示不做任何操作

注意这里的操作只有插入和删除,没有替换。

论文算法

diagonal k,D-path,snake的定义

论文阅读:An O(ND) Difference Algorithm and Its Variations

推论1

论文阅读:An O(ND) Difference Algorithm and Its Variations

推论2

论文阅读:An O(ND) Difference Algorithm and Its Variations

简略版算法

论文阅读:An O(ND) Difference Algorithm and Its Variations

详细算法

论文阅读:An O(ND) Difference Algorithm and Its Variations

论文算法存在的问题

将3种操作中的替换操作视为了一个插入加一个删除,其实是将三种操作赋予了不同的权重

应用

相关文章:

  • 2022-12-23
  • 2021-10-01
  • 2021-05-31
  • 2021-08-25
  • 2021-12-24
  • 2021-05-08
  • 2021-10-22
  • 2021-10-16
猜你喜欢
  • 2021-07-05
  • 2021-10-14
  • 2021-08-22
  • 2021-11-01
  • 2021-11-18
  • 2021-11-25
  • 2022-12-23
相关资源
相似解决方案