動態規劃 編輯距離

2021-08-09 21:30:32 字數 2471 閱讀 3728

1. 實踐題目

編輯距離

2.問題描述

設a和b是2個字串。要用最少的字元操作將字串a轉換為字串b。這裡所說的字元操作包括 (1)刪除乙個字元; (2)插入乙個字元; (3)將乙個字元改為另乙個字元。 將字串a變換為字串b所用的最少字元運算元稱為字串a到 b的編輯距離,記為d(a,b)。對於給定的字串a和字串b,計算其編輯距離 d(a,b)。

3. 演算法描述

這是乙個動態規劃問題。我們定義乙個二維陣列d[i][j]來儲存這些編輯最小操作,它表示將串a[0:i-1]轉變為b[0:j-1]的最小步驟(a和b是兩個字元陣列,從下標0開始初始化)。

然後我們分情況先討論:

當i = 0時:a串為空,那麼轉變為b串就是不斷新增字元,d[0][j] = j。

當j = 0時:b串為空,那麼轉變為b串就是不斷刪除字元,d[i][0] = i。

接下來是一般情況:我們考慮到字元的操作有三種,分別是刪除、增加和替換,那麼它們的操作就是在前一步的操作下以最少的次數增刪改。現在分三種情況:

1)假設把a[1:i] -> b[1:j-1]要x個步驟,那只要在b[j]增加a[i]後面就搞定了,那就需要x+1步操作。

2)假設把a[1:i-1] -> b[1:j]要x個步驟,那麼只要在刪除a[i]就好了,需要x+1步操作。

3)假設把a[1:i-1] -> b[1:j-1]要x個步驟,那麼只需要把a[i]替換為b[j]就ok了,那就需要x+1步操作。如果a[i] == b[j],只需要x步。

所以填表法的思想來講,就是從上面三種情況中選最小的,填入**中。

遞迴公式: 1<=i<=length_a, 1<=j<=length_b

d[i][j] =min(d[i-1][j-1], d[i][j-1]+1, d[i-1][j]+1), a[i-1] == b[j-1]時

(之前和同學討論的時候,有人提到在上面這種情況的時候,只需要讓d[i][j] = d[i-1][j-1]就可以了,我交了一下確實也可以……但是我找不出特例。如果從這三個中取最小反而更好理解,解釋得通,也讓這個遞迴公式有通用性,我覺得)

d[i][j] =min(d[i-1][j-1]+1, d[i][j-1]+1, d[i-1][j]+1),  a[i-1] != b[j-1]時

最優值:d[length_a][length_b]

我們初始化d陣列xw

rs01

234f

1112

3x2p

3i4m

5u6

其他以此類推。

最優值:d[length_a][length_b]

4.演算法時間及空間複雜度分析

時間複雜度:其實是對乙個二維陣列d[length_a+1][length_b+1]進行填寫的花銷,其他的只是一些簡單的加減運算和比較,所以雙重迴圈對演算法的花銷貢獻最大,時間複雜度為o(mn)。

空間複雜度:因為用到了二維陣列d,故為o(mn)。

5.**

#include#includeusing namespace std;

int d[2005][2005];

/*輸入的兩個字元陣列為a, b,從下標為0開始初始化

長度分別為length_a, length_b

陣列d[m][n]存放從a[1:m] 變為 b[1:n]所需要的最少操作

遞迴公式:

d[i][j] = 0, i=0或j=0 時(即陣列的第一行和第一列均為0)

1<=i<=length_a, 1<=j<=length_b

d[i][j] = d[i-1][j-1], a[i-1] == b[j-1]

d[i][j] = min(d[i-1][j-1]+1, d[i][j-1]+1, d[i-1][j]+1), a[i-1] != b[j-1]

最優值:d[length_a][length_b]

*/int min(int a, int b, int c)

if(temp > c)

return temp;

}int edit(char *a, char *b)

for(int i = 0; i <= length_b; i++)

for(int i = 1; i <= length_a; i++)

else

} }return d[length_a][length_b];

}int main(){

char a[2000], b[2000];

cin>>a>>b;

cout<

動態規劃 編輯距離

給定兩個序列x和y,求從乙個序列到另乙個序列所需變換的最小次數,這裡的變換包括刪除,新增和替換,每次只對乙個元素進行操作。演算法序言 這個題目有點像之前寫的最長公共子串行問題,也是用動態規劃的演算法。能夠應用動態規劃的題目有乙個特點就是具有最優子結構,就是整個問題的最優解會包含子問題的最優解,那麼我...

動態規劃 編輯距離

將乙個字串變為另乙個字串最小操作次數,您對單詞允許以下3種操作 a 插入字元 b 刪除字元 c 替換字元 例如 a horse 變成 b ros 想法 coding utf 8 def char array replace array1,array2 row len array1 col len a...

動態規劃 編輯距離

求解編輯距離問題 一.演算法設計 這是一道經典的動態規劃問題,兩個字串的對齊方式很多,如果要將所有的對齊方式都考慮一遍,演算法的效率將十分低下。分解子問題的辦法是看兩個字串的字首,現令e i,j 表示字串x與字串y的相應字首的編輯距離,則e n,m 就是所求的答案。對於三種編輯操作的變化,對於e i...