1. 程式人生 > >第三章上機實踐報告

第三章上機實踐報告

1.實踐題目

7-3編輯距離問題

 

2.問題描述

設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

 

3、演算法描述

這是一個動態規劃問題。定義一個二維陣列d[i][j]來儲存這些編輯最小操作。

然後分情況:

當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] =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]

 

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

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

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

5、心得體會

主要是動態規劃的問題,這一塊我覺得比較難,花了比較多時間去理解和修改,同時經過與同伴的討論和分析,體驗到合作的高效率和不同解題方法的帶來的思考,一起快樂敲程式碼。