动态规划法 单词间最短距离
编辑距离定义:将字符串S通过插入、删除、替换三种编辑操作,转变为字符串T,所需最少的编辑次数。
计算编辑距离的问题,符合动态规划的几个特征:
- 最优子结构性质。如果问题的最优解所包含的子问题的解也是最优的,我们就称该问题具有最优子结构性质(即满足最优化原理)。最优子结构性质为动态规划算法解决问题提供了重要线索。
- 无后效性。即子问题的解一旦确定,就不再改变,不受在这之后、包含它的更大的问题的求解决策影响。
- 子问题重叠性质。子问题重叠性质是指在用递归算法自顶向下对问题进行求解时,每次产生的子问题并不总是新问题,有些子问题会被重复计算多次。动态规划算法正是利用了这种子问题的重叠性质,对每一个子问题只计算一次,然后将其计算结果保存在一个表格中,当再次需要计算已经计算过的子问题时,只是在表格中简单地查看一下结果,从而获得较高的效率。
采用动态规划。公式为:

这个算法的特点是,两个字符串左边始终是对齐的。
理解公式后,我选择python作为编程语言(这两天才学想练练手)
def dp(m,n):
len_1=lambda x:len(x)+1
c=[[i] for i in range(0,len_1(m)) ]
c[0]=[j for j in range(0,len_1(n))]
for i in range(0,len(m)):
print (i,' ')
for j in range(0,len(n)):
c[i].append(
min(
c[i][j-1]+1,#insertion
c[i-1][j]+1,#delection
c[i][j] + (0 if m[i]==n[j] else 2 )#substitute
)
)
print (c[i-1][j-1],m[i],n[j],' ',)
print ('')
return c[-1][-1]
实验的结果显示:

总结:
说起对算法的很多感悟,更多是对python这门语言,很简单易上手但是也很容易出现以前没想到过的错误。最短距离上,考虑了除了动态规划算法,不知道图论是否也是一种可行的方式。
谢谢姜沛林老师的教诲!

浙公网安备 33010602011771号