700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 最小编辑距离(Minimum Edit Distance)

最小编辑距离(Minimum Edit Distance)

时间:2023-09-26 01:41:04

相关推荐

最小编辑距离(Minimum Edit Distance)

概念

编辑距离的概念:

给定两个字符串oppa和apple,如何把前者变成后者?你可以使用的操作有:1.增加字符2.删除字符3.更新字符。

一种可能的做法是:

oppa->appa->appl->apple:共使用了3次编辑。

可以验证,上面的字符串转换做法就是最小编辑距离,其他的做法诸如:

oppa->aoppa->apppa->appla->apple:4次

这都不是我们想要的。

求解

求解两个字符串的最小编辑距离,我们使用动态规划(dynamic programing)的思想。因为我们发现这个问题可以有如下的问题分解形式,即:

我们一旦确定了两个字符串设为 w 1 = w m a , w 2 = w n b w_1=w_ma,w_2=w_nb w1​=wm​a,w2​=wn​b(这里是将 w 1 , w 2 w_1,w_2 w1​,w2​分解成了两部分,其中a,b是一个字符,前面的 w m , w n w_m,w_n wm​,wn​是前面的子串,以上6个符号均可为空)的最小编辑距离 L ( w 1 , w 2 ) L(w_1,w_2) L(w1​,w2​)和相应的编辑操作序列,那么必有:

若 a , b a,b a,b不相等,则:

L ( w 1 , w 2 ) = m i n ( L ( w m , w n ) , L ( w m , w 2 ) , L ( w 1 , w n ) ) + 1 L(w_1,w_2)=min(L(w_m,w_n),L(w_m,w_2),L(w_1,w_n))+1 L(w1​,w2​)=min(L(wm​,wn​),L(wm​,w2​),L(w1​,wn​))+1若 a , b a,b a,b相等,则:

L ( w 1 , w 2 ) = L ( w m , w n ) L(w_1,w_2)=L(w_m,w_n) L(w1​,w2​)=L(wm​,wn​)

显然,上面的两个式子,我们把原问题分解到了规模更小的子问题,这就是动态规划。

上面两个式子没看懂没关系,下面有例子

例子

下面展示动态规划是如何解决oppa和apple的最小编辑距离的。

我们知道动态规划有2步核心,一步是上面的状态转移方程,就是上面的式子,一步是初始状态的确定。

1.初始化

首先在每个字符串的前面添加一个空格(在这里也可以叫做空串)。为什么要添加?显然,按照上面的转移方程 L ( w 1 , w 2 ) = m i n ( L ( w m , w n ) , L ( w m , w 2 ) , L ( w 1 , w n ) ) + 1 L(w_1,w_2)=min(L(w_m,w_n),L(w_m,w_2),L(w_1,w_n))+1 L(w1​,w2​)=min(L(wm​,wn​),L(wm​,w2​),L(w1​,wn​))+1,要解决后面的问题,需要前面3个子问题的答案才能解决。而这三个子问题不就是左上,左,上的格子要先初始化填好吗?即:

初始化是简单的,拿上面的图片为例,其他依次类推。

空格变成空格,需要0次编辑空格变成a,需要1次编辑(添加操作)o变成空格,需要1次编辑(删除操作)

依次求解

接下来根据转移方程依次求解剩下来的格子

为什么格子填入了1?由于o和a不相等,所以应用第一个公式 L ( w 1 , w 2 ) = m i n ( L ( w m , w n ) , L ( w m , w 2 ) , L ( w 1 , w n ) ) + 1 L(w_1,w_2)=min(L(w_m,w_n),L(w_m,w_2),L(w_1,w_n))+1 L(w1​,w2​)=min(L(wm​,wn​),L(wm​,w2​),L(w1​,wn​))+1,我们发现左上,左,上三个格子中最小的是左上0,然后0+1=1,这就是最终结果。

结果解释:由于是从左上选取的,所以就是说此过程有两步,1.o前面的空串经过0次编辑变成了a前面的空串2.将o替换为a。

为什么格子填入了2?由于o和p不相等,所以应用第一个公式 L ( w 1 , w 2 ) = m i n ( L ( w m , w n ) , L ( w m , w 2 ) , L ( w 1 , w n ) ) + 1 L(w_1,w_2)=min(L(w_m,w_n),L(w_m,w_2),L(w_1,w_n))+1 L(w1​,w2​)=min(L(wm​,wn​),L(wm​,w2​),L(w1​,wn​))+1,我们发现左上,左,上三个格子中最小的是左上1或者左1,然后1+1=2,这就是最终结果。

结果解释:两种选择

如果是从左上选取的,所以就是说此过程有两步,1.o前面的空串已经经过1次编辑变成了a2.将o替换为p。如果是从左选取的,所以就是说此过程有两步,1.o已经经过1次编辑变成了a2.添加一个p。

其他依次类推,此处省略若干步,到达第二个公式的用武之地:

为什么(p,p)处填入1?根据第二个公式,由于两个字符相等,都是p,所以: L ( w 1 , w 2 ) = L ( w m , w n ) L(w_1,w_2)=L(w_m,w_n) L(w1​,w2​)=L(wm​,wn​),即找左上的(o,a)=1拿过来就行了。

第二个公式的证明

其实也可以继续使用之前的那个公式,但是需要稍微更改一下,即有能达到目的的3种候选方案,分别是:左上,左加1,上加1。然后选最小。,即:

L(op,ap)=min{1,2+1,2+1}=1

上述3种方案的含义:

左上方案,因为最后一个字母相同,所以左上完成后(o已经->a),就相当于整个完成了。左加1,因为左边是指op->a最短需要2步,此时op已经变成了a,当然还要有一个添加p的操作,所以要加1。为什么要上加1,因为上面是o->ap最短需要2步,此时o变成了ap,当然就要把op中的p进行删除操作即可,所以加1。

下一个要证明的问题:为什么这三者一定是左上最小呢?

因为相邻的值的绝对值之差,可能为0,最大为1。由于左和左上相邻,所以最多相差1,由于上和左上相邻,所以最多也相差1。

左加1(那么加1后肯定大于等于左上)上加1(那么加1后肯定页大于等于左上)

有了这个结论,我们就可以大胆地选择公式2了,即当 a = b a=b a=b时直接选左上的。

公布最终结果

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。