动态规划法 单词间最短距离

编辑距离定义:将字符串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这门语言,很简单易上手但是也很容易出现以前没想到过的错误。最短距离上,考虑了除了动态规划算法,不知道图论是否也是一种可行的方式。

谢谢姜沛林老师的教诲!

posted @ 2018-03-03 16:40  Nnn_Lillian  阅读(191)  评论(0)    收藏  举报