动态规划----通俗理解动态规划解决最小编辑距离的原理

最小编辑距离

两个字符串之间的最小编辑距离,就是其中一个字符串通过若干次插入,删除,替换字符从而得到另一个字符,而这若干次就是最小编辑距离,这里假定允许替换为一次操作,否则替换则认为是删除,插入,是两次操作。

原理方面这里有一片写的很详细的博文https://blog.csdn.net/qq_34552886/article/details/72556242,以下主要为举例理解。

先上一个图

可以看见,这是execution和intention两个词的最短编辑距离的求解过程矩阵

显然的是,空白变成任何单词的距离都是该单词的长度,所以先初始划矩阵,就是#对应的行和列。

先说各自第一个字母e,i显然,e和i间有三种变换途径,一个是e后面加i,然后求e到空白的最小编辑距离(dic1-1][1]+1);

一是把e删了,求空白到i的距离(dic[1][1-1]+1);还有就是把e换成i再加上空白到空白的距离,这里的表换是取2(dic[1-1][1-1]+2);取三者最小的即可

再说ex,到i的距离,这是e到i的距离已经求得。同理,ex变成i也有三种途径,首先ex后面加i,然后求ex到空白的距离(dic[1-1][2]+1);一是把x删了,求e到i的距离(dic[1][2-1]+1);还有就是把x换成i再加上e到空白的距离,这里的表换是取2(dic[1-1][2-1]+2);取三者最小的即可

依次类推,很快可以求出e到intention的距离,然后再算ex到intention的距离,依次类推,直到算出两个词之间的距离8。

附上https://blog.csdn.net/u010897775/article/details/40018889来自大神的代码,个人将其改成了python3.*版本

def edit(str1, str2):
    
    matrix = [[i+j for j in range(len(str2) + 1)] for i in range(len(str1) + 1)]
 
 
    for i in range(1,len(str1)+1):
        for j in range(1,len(str2)+1):
            if str1[i-1] == str2[j-1]:
                d = 0
            else:
                d = 1
            matrix[i][j] = min(matrix[i-1][j]+1,matrix[i][j-1]+1,matrix[i-1][j-1]+d)
 
 
    return matrix[len(str1)][len(str2)]
 
 
print(edit('ofailing','osailn'))

猜你喜欢

转载自blog.csdn.net/aaalswaaa1/article/details/83793666