1. 程式人生 > >算法第三章實踐報告

算法第三章實踐報告

修改 報告 strlen 字符串 復雜度 操作數 數組下標 後來 刪除

算法第三章 實踐報告

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]。同時在編寫程序的過程中,一開始沒有註意數組下標這方面的細節所以導致了運行出錯,後來通過具體的例子,畫出對應的編輯距離的二維數組,這樣才把下標使用對了。

算法第三章實踐報告