德勒曼-温施算法
德勒曼-温施算法
简介
德勒曼-温施算法(Needleman-Wunsch)算法,是一种对于字符串的模糊匹配算法。1970其由美国两位研究人员提出并最早应用于对基因序列的分析。值得一提的是,它也是历史上最早应用动态规划思想的算法之一。
相关概念
编辑距离
编辑距离是一种描述字符串之间匹配程度的指标,定位为:两字符串的编辑距离是指由一个字符串转换为另一个字符串的最少编辑操作次数。允许的编辑操作包括替换一个字符、插入或者删除一个字符。
编辑距离的评分方案
在实际的算法执行中,德勒曼-温施算法设定字符间的关系有三种:
1.匹配
2.不匹配
3.插入或者删除
对以上的关系设计评分方案,例如设定匹配为+1,其余为-1。或者也可设定匹配为+1,其余为0.
算法描述
算法开始,对一个长度为M的字符串与另一个长度为N的字符串进行运算以求其编辑距离。首先,建立一个(M+2)*(N+2)的矩阵。并将第一个字符串填入第一列的后M空格(编号1到M-1),并将第二个字符串填入第一行的后N空格(编号1到N-1)。计第二行第二列处的值为0,并按照一定规则填满矩阵右下角的M行N列。
计算规则为:如果希望计算矩阵中[i] [j]点的值,且已设[0] [j]处的字符为A,[i] [0]处的字符为B。那么[i] [j]点的值是通过上方、左方、左上方三个方向计算结果取最大值。
左方和上方:如果从左方一格[i-1] [j]或者上方一格[i] [j-1]求取[i] [j],这字符串中,就等价于在匹配过程中需要增加或者删去一个字符,需要对[i-1] [j]或者[i] [j-1]执行评分方案中的插入或删除分数改动。
从左上方:如果从左上方一格也就是[i-1] [j-1]的值求取[i] [j]的值,这代表不对字符串进行插入或者删除操作,而直接比较A与B。如果AB相等,则执行评分方案中的匹配分数改动,反之,执行不匹配分数改动。
依次迭代,最终填满右下角。而此时,矩阵最右下角的的一个元素就是这两个字符串的编辑距离。而如果我们希望知道这个编辑距离对应的编辑操作具体是什么,就通过这个方格一路回溯到起始的0点,回溯的路径就代表了编辑的操作。当然,路径往往不只一条。
需要提醒的有:首先,为什么要将矩阵设为(M+2)*(N+2),在这里可以设想一下如果是对一个空字符串进行运算的情况;其次,在矩阵中,紧邻着两个字符串的空格没有办法通过三个方向求值,那么就使用仅有的一个方向进行填充就可以了。
算法举例
例1
设两个字符串分别为A=GGATCGA,B=GAATTCAGTTA。设定评分规则为:匹配+1,其余+0。
初始化矩阵
填充矩阵
回溯
例2
设两个字符串分别为GATTACA 和GCATGCA。评分方案为,匹配+1,其他-1。
初始化矩阵
填充及回溯
最终回溯结果
参考资料
1.算法之美——隐匿在数据结构背后的原理(C++版)左飞
2.https://www.cnblogs.com/houkai/p/3973207.html