第三章上机实践报告
1. 实践题目
7-3 编辑距离问题 (30 分)
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)
3. 算法描述
递归方程
m = a.length();
n = b.length();
d [ i ] [ j ] = d [ i – 1] [ j – 1] , (A [ a – 1 ] = B [ b – 1 ] )
d [ i ] [ j ] = min ( d [ i ] [ j – 1] + 1 , d [ i – 1 ] [ j ] + 1 , d [ i – 1 ] [ j – 1] + 1) , ( A [ a – 1] != B [ b – 1] )
#include#include #include using namespace std;char a[2000],b[2000];int d[2000][2000];int main(){ cin>>a; cin>>b; int m=strlen(a); int n=strlen(b); for(int i=1;i<=m;i++) d[i][0]=i; for(int j=1;j<=n;j++) d[0][j]=j; for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) if(a[i-1]==b[j-1]) d[i][j]=d[i-1][j-1]; else d[i][j]=min(min(d[i-1][j-1],d[i-1][j]),d[i][j-1])+1; cout<
4. 算法时间及空间复杂度分析
时间复杂度:T(n) = a + b + a * b
所以时间复杂度 O( a * b );
空间复杂度:整个算法在计算过程中新定义了一个存储编辑距离的数组d[a][b]
所以空间复杂度为 O(a * b)
5. 心得体会(对本次实践收获及疑惑进行总结)
在7-3这道题中,起初的想法是先求出字符串A和字符串B的公共最长子序列长度m ,最短编辑距离 = B.length() – m。在与结对同伴的讨论之后,这种方法存在问题,如:当字符串A 为abcdef 字符串B 为 ascdef 时,d(A, B) = 1, 而按照上述想法的结果 d(A, B) = 2。
本章的动态规划,对问题分析和解决问题的方法对个人来说是一个很大的难点。
动态规划的基本方法:
1) 找出最优解的性质,并刻画其结构的特征
2) 递归定义最优值,写出递归方程
3) 思考表的维数,范围和根据递归方程按照什么顺序填
4) 根据计算最优值时得到的信息,构造最优解