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. 演算法描述

 1 #include <iostream>
 2 #include <string>
 3 using namespace std;
 4 
 5 string A, B;
 6 int n1, n2;
 7 int n[2002][2002];
 8 
 9 int main()
10 {
11     getline(cin, A);
12     getline(cin, B);
13     int a = A.length();
14     int b = B.length();
15     for(int i=1
; i<=a; i++) 16 { 17 n[i][0] = i; 18 } 19 for(int j=1; j<=a; j++) 20 { 21 n[0][j] = j; 22 } 23 for(int i=1; i<=a; i++) 24 { 25 for(int j=1; j<=b; j++) 26 { 27 if(A[i-1]==B[j-1]) 28 { 29 n[i][j] = n[i-1
][j-1]; 30 } 31 else 32 { 33 n[i][j] = min(min(n[i-1][j]+1, n[i][j-1]+1),n[i-1][j-1]+1); 34 } 35 } 36 } 37 cout << n[a][b]; 38 return 0; 39 }

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

程式碼第23行到36行是本程式中巢狀層數最多的地方,共巢狀2層for迴圈,因此,演算法時間複雜度級別為O(n2)。

由於本程式開闢了一個二維陣列來存放從i到j的最短編輯距離,因此,演算法空間複雜度級別也為O(n2)。

5. 心得體會

我在初次看到這題的時候,由於題目內容涉及到字串的處理,我又最近自學了Python 3,深感Python字串處理的簡便,於是使用Python以相同的遞迴方程寫了程式碼提交,測試結果為:

測試點0答案正確,耗時220ms,記憶體36116KB;測試點1答案正確,耗時215ms,記憶體35880KB;測試點2執行超時。

在進行各種嘗試都無法成功使程式通過2號測試點的測試後,想到是與語言相關的問題,於是按同一個方程寫C++程式,一遍過,三個測試點的耗時分別為3 / 5 / 44ms,記憶體佔用分別為384 / 512 / 11436KB。

Python是一種動態型別、解釋型的語言。查閱資料得知,其萬物皆物件的特性就是導致其執行慢的一個原因,Python的物件模型會帶來低效的記憶體訪問。

因此,對於時間和記憶體要求不高的題目可以用Python寫(縮排為主的程式碼風格可讀性強,編寫簡單),如果要求較高,還是使用C++為好。

經過這次實踐,我還發現了C++裡面#include <string>之後string類的操作其實也非常便捷,並不輸給Python,需要掌握這種用法。