【转】最小编辑距离 算法原理
問題
最小編輯距離 Minimum Edit Distance
關于兩個字符串s1,s2的差別,可以通過計算他們的最小編輯距離來決定。
設A、B為兩個字符串,狹義的編輯距離定義為把A轉換成B需要的最少刪除(刪除A中一個字符)、插入(在A中插入一個字符)和替換(把A中的某個字符替換成另一個字符)的次數,用ED(A,B)來表示。直觀來說,兩個串互相轉換需要經過的步驟越多,差異越大。
例如 s1 = "12433" 和 s2 = "1233";
則可以通過在s2中間插入4得到12433與s1一致。
即 d(s1,s2) = 1 (進行了一次插入操作)
性質
計算兩個字符串s1+c1, s2+c2的編輯距離有這樣的性質:
1. d(s1,"") = d("",s1) = |s1|d("c1","c2") = c1 == c2 ? 0 : 1; 2. d(s1+c1,s2+c2) = min( d(s1,s2)+ c1==c2 ? 0 : 1 ,d(s1+c1,s2),d(s1,s2+c2) );第一個性質是顯然的。
第二個性質: 由于我們定義的三個操作來作為編輯距離的一種衡量方法,于是對c1,c2可能的操作只有:
因此可以得到計算編輯距離的性質2。
復雜度分析
從上面性質2可以看出計算過程呈現這樣的一種結構(假設各個層用當前計算的串長度標記,并假設兩個串長度都為 n )
可以看到,該問題的復雜度為指數級別 3 的 n 次方,對于較長的串,時間上是無法讓人忍受的。
分析: 在上面的結構中,我們發現多次出現了 (n-1,n-1), (n-1,n-2)……。換句話說該結構具有重疊子問題。再加上前面性質2所具有的最優子結構。符合動態規劃算法基本要素。因此可以使用動態規劃算法把復雜度降低到多項式級別。
動態規劃求解
首先為了避免重復計算子問題,添加兩個輔助數組。
一. 保存子問題結果。
M[ |s1| ,|s2| ] , 其中M[ i , j ] 表示子串 s1(0->i) 與 s2(0->j) 的編輯距離
二. 保存字符之間的編輯距離.
E[ |s1|, |s2| ] , 其中 E[ i, j ] = s1[i] = s2[j] ? 0 : 1
三. 新的計算表達式
根據性質1得到
根據性質2得到
M[ i, j ] = min( m[i-1,j-1] + E[ i, j ] ,m[i, j-1] + 1 ,m[i-1, j] + 1 );復雜度
從新的計算式看出,計算過程為
因此復雜度為 O( |s1| * |s2| ) ,如果假設他們的長度都為n,則復雜度為 O(n^2)
改進
當s[i]和s[j]相等時,代價為0,必然為最小值,所以首先判斷兩字符是否相等,若相等則直接判定M[i][j]=M[i-1][j-1],判斷下個。這樣可以省很多計算。
工具宏:直接用一個宏來完成“求取三者最小值”的功能。不同于遞歸,宏定義消耗很小,完全可以放心使用。
1: #ifndef _MIN(xyz) 2: #define _MIN(xyz) ((x<y)?((x<z)?x:z):((y<z)?y:z)) 3: #endif // _MIN(xyz)
轉載于:https://www.cnblogs.com/sk-blogs/articles/3681693.html
總結
以上是生活随笔為你收集整理的【转】最小编辑距离 算法原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [痛并快乐着 国外开发者总结欧美游戏坑钱
- 下一篇: Poj 2284 That Nice