算法第三章實踐報告
算法第三章 實踐報告
1.實踐題目
7-3 編輯距離問題 (30 分)
設A和B是2個字符串。要用最少的字符操作將字符串A轉換為字符串B。這裏所說的字符操作包括 (1)刪除一個字符; (2)插入一個字符; (3)將一個字符改為另一個字符。 將字符串A變換為字符串B所用的最少字符操作數稱為字符串A到 B的編輯距離,記為d(A,B)。 對於給定的字符串A和字符串B,計算其編輯距離 d(A,B)。
輸入格式:
第一行是字符串A,文件的第二行是字符串B。
提示:字符串長度不超過2000個字符。
輸出格式:
輸出編輯距離d(A,B)
輸入樣例:
在這裏給出一組輸入。例如:
fxpimu
xwrs
輸出樣例:
在這裏給出相應的輸出。例如:
5
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到b的編輯距離。
當i=0時,表示數組a中有0個元素,則d[0][j]=j,
當j=0時,表示數組b中有0個元素,則d[i][0]=i.
遞歸方程為 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]時)
min中的三項依此對應修改、插入和刪除三種操作。
部分代碼:
int lena = strlen(a);
int lenb = strlen(b);
for(int i=0;i<=lena;i++){
d[i][0] = i;
}
for(int i=0;i<=lenb;i++){
d[0][i] = i;
}
for(int j=1;j<lenb+1;j++){
for(int i=1;i<lena+1;i++){
if(a[i-1]==b[j-1]) {
d[i][j] = d[i-1][j-1];
}
else {
d[i][j] = min(d[i-1][j-1]+1,d[i][j-1]+1,d[i-1][j]+1);
}
}
}
cout<<d[lena][lenb];
4.算法時間及空間復雜度分析(要有分析過程)
因為有兩重循環,所以算法的時間復雜度為O(lena*lenb)
開設了一個二維數組,所以算法的空間復雜度為O(lena*lenb)
5.心得體會(對本次實踐收獲及疑惑進行總結)
在本次實踐中,再次運用了動態規劃的思想,最後發現這道題的算法和求解最長公共子序列的算法有相似之處。只不過最長公共子序列是從兩字符串的後面開始比較,而這道題從兩字符串的開頭開始比較,比較有利於填寫d[i][j]。同時在編寫程序的過程中,一開始沒有註意數組下標這方面的細節所以導致了運行出錯,後來通過具體的例子,畫出對應的編輯距離的二維數組,這樣才把下標使用對了。
算法第三章實踐報告