【實踐】算法第三章上機實踐報告

1. 實踐題目ios

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。spa

提示:字符串長度不超過2000個字符。code

輸出格式:
輸出編輯距離d(A,B)對象

輸入樣例:
在這裏給出一組輸入。例如:blog

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,須要掌握這種用法。

相關文章
相關標籤/搜索