编辑距离算法(动态规划)

最近在看ctc的经典论文。谈及了语音识别中的字符串编辑距离。
编辑距离:
就是一个字符串经过一些操作变成与另一个字符串相同的代价。概念有点像推土距离,不过推土距离没有字符串中的顺序问题。编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。编辑距离越小,两个串的相似度越大。

可以举个例子来总结规律。
比如
A:cdapph
B: ddcpih
初始化A和B的指针,都指向两个字符串开头i=1,j=1.
1.可以插入A对应位置也就是i-1位置上B的j指针对应的字符,也就是A变成dcdapph。
2.也可以在B对应位置删除j对应的字符。也就是B变成dcpih。
3.也可以是某一个直接修改成对应字符。比如A修改成ddapph。当然如果i位置和j位置字符相等的话,就不用修改,就可以指针前进了。

1,2步,对于即使i和j位置字符相等的情况也是可以进行操作的。
比如A:cd,B:c,当A指针为c,B也为c的时候,A删除c变成d,指针+1.B不变。然后计算A:d和B:c的距离。

以下复制来自https://blog.csdn.net/baodream/article/details/80417695,具体可以查看更详细的分析和代码实现:
用edit[i][j]表示A串和B串的编辑距离。edit[i][j]表示A串从第0个字符开始到第i个字符和B串从第0个字符开始到第j个字符,这两个字串的编辑距离。字符串的下标从1开始。

dis[0][0]表示word1和word2都为空的时候,此时他们的Edit Distance为0。很明显可以得出的,dis[0][j]就是word1为空,word2长度为j的情况,此时他们的Edit Distance为j,也就是从空,添加j个字符转换成word2的最小Edit Distance为j;同理dis[i][0]就是,word1长度为i,word2为空时,word1需要删除i个字符才能转换成空,所以转换成word2的最小Edit Distance为i。

则从上面的分析,不难推导出动态规划方程:

,其中

上式中的min()函数中的三个部分,对应三种字符操作方式:

edit[i-1][j]+1相当于给word2的最后插入了word1的最后的字符,插入操作使得edit+1,之后计算edit[i-1][j];

edit[i][j-1]+1相当于将word2的最后字符删除,删除操作edit+1,之后计算edit[i][j-1];

edit[i-1][j-1]+flag相当于通过将word2的最后一个字符替换为word1的最后一个字符。flag标记替换的有效次数。

对于动态规划,还有分治算法,记得本科算法老师天天叨叨叨也没认真听也没认真思考。现在有些接触到的算法用到动态规划,比如路径最优解问题,因为组合的爆炸所以使用了动态规划,其实发现也不是很高大上的问题,我的理解就是动态规划是走一步看一步,有点贪婪的意味,求解当前最优。动态规划和分治算法最大的相似就是都把一个大问题分解成子问题,最大的不同就是子问题之间的独立性。分治算法就像是大陆和港澳,同属一个问题但是在某个性质上是独立的(没有什么别的政治意思就是个类比)。动态规划要子问题之间有依赖。比如路径规划问题,当前所处的位置是与之前的移动路径有关系的。

猜你喜欢

转载自blog.csdn.net/yuwenqi123456/article/details/87715630