动态规划问题-最小编辑距离(Minimum Edit Distance)
我们今天要探讨的动态规划问题来源于俄罗斯科学家Levenshtein提出的两个对象之间的不相似度,在音频、语言翻译等领域有广泛的应用。如果用于评估字符串之间的不相似度,那么又称为最小编辑距离MED(Minimum Edit Distance),它规定从string 1到转换成 string 2的最少操作数,最少操作数(MED)越大, 那么两个字符串相似度越低;最少操作数(MED)越小,那么两个字符串的相似度就越高,如果两个字符串完全相同,那么最小编辑距离值为0。
今天要解决的问题来源于Leecode 问题 72, 问题描述:
给你两个单词
word1和word2, 请返回将word1转换成word2所使用的最少操作数 。你可以对一个单词进行如下三种操作:
- 插入一个字符
- 删除一个字符
- 替换一个字符
这是典型的动态规划问题,因为word 1和word 2可以划分为子问题,而且子问题与原问题有类似的解结构。为了证明其是动态规划问题,借助《算法导论》中的CRCC 分析流程,对此问题进行解决分析。
- 表征最优问题的结构(Characterize the structure of the optimal solution)
首先确定操作对象为word1当中的字符,需要确认将其转化为word2所使用的最少操作数(MED),那么对于word1中的每个字符(包括∅),针对word1中的第i个字符,和word2中的第j个字符,有两大类:
如果word1[i]和word[j]相等,那么只需要把各自的操作对象字符往前移动一位,对于实际的最少操作数(MED)没有影响。如果word1[i]和word[j]不相等,面临三个选项:
a.) 删除操作,删除word1中的当前字符i
b.) 替换/更新操作,对于word1中的当前i字符,使用word2中的第j个字符进行替代
c.) 插入操作,在第i个位置插入word2的第j个字符
需要操作的动作是,三个选项都需要尝试,然后采纳操作数最小的操作动作。我们不排斥三个选择当中的任何一个,我们要做的是try them and try THEM ALL, 这个思想类似穷举法,我们对所有的可能都进行判断,然后择优选择。这一点也是动态规划不同于贪心算法的关键,贪心算法每一步只选择某个最优项目,无需对所有选择进行判断,然后基于当前最优前景的选择,进行下一步的相关操作。所以动态规划类似撒网,贪心算法类似垂钓,两类问题在对待子问题的选择上不同。
- 递归定义最优解的值
接下来来到最关键的一步,通过递归来定义最优解的值,假定word1=<x1,x2,x3.xi…xm>, word2=<y1,y2,y3…yj.yn>,我们定义数组dp[i] [j]来定义<x1,x2,x3…xi>和<y1,y2,y3…yj>的最少操作数(MED),对于最少操作数的矩阵dp[i] [j],可以有下面的选择:
a.)如果x[i]==y[j],那么dp[i] [j]=dp[i-1] [j-1], 也就是说,如果二者相等,<x1,x2,x3…xi>和<y1,y2,y3…yj>的最少操作数(MED)等于<x1,x2,x3…xi-1>和<y1,y2,y3…yj-1>的最少操作数(MED)。
d p [ i ] [ j ] = d p [ i − 1 ] [ j − 1 ] , w h e n t h e x [ i ] e q u a l s t o y [ j ] dp[i][j]=dp[i-1][j-1], when\ the\ x[i]\ equals\ to\ y[j] dp[i][j]=dp[i−1][j−1],when the x[i] equals to y[j]
b.)如果x[i]≠y[j],这时候需要从删除、插入、更新三个选择中选择最小的最少操作数(MED),况且这三个选择的代价相同,无论选择哪一个,其最少操作数(MED)都需要追加1。
接下来我们用公式表示这三个选择。
d p [ i ] [ j ] = m i n { d p [ i − 1 ] [ j ] + 1 , d p [ i ] [ j − 1 ] + 1 , d p [ i − 1 ] [ j − 1 ] + 1 } dp[i][j]=min\left\{dp[i-1][j]+1,dp[i][j-1]+1,dp[i-1][j-1]+1\right\} dp[i][j]=min{
dp[i−1][j]+1,dp[i][j−1]+1,dp[i−1][j−1]+1}
dp[i-1] [j]+1表示假定选择删除第word1中的第i个字符,作为最少操作数(MED)的情况,相当于word1指向i字符的指针先向前移动1位,同时由于word2中的第j位字符还没有进行任何比较(删除word1[i]后,无法进行比较),所

文章介绍了动态规划问题中的最小编辑距离算法,用于计算两个字符串之间的不相似度。通过递归定义最优解的值,展示了如何从字符串word1转换到word2所需的最少操作数。该问题的关键在于尝试所有可能的操作(删除、插入、替换),并选择成本最低的选项。文章还提供了C语言的代码实现,包括迭代和递归两种方法。
最低0.47元/天 解锁文章
3186

被折叠的 条评论
为什么被折叠?



