第三章上机实践报告

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、心得体会

主要是动态规划的问题,这一块我觉得比较难,花了比较多时间去理解和修改,同时经过与同伴的讨论和分析,体验到合作的高效率和不同解题方法的带来的思考,一起快乐敲代码。

猜你喜欢

转载自www.cnblogs.com/wxl99/p/9905501.html