算法第三章上机实践报告

算法第三章上机实践报告

实践题目

设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

 

问题描述

找出字符串的编辑距离,即把一个字符串s1最少经过多少步操作变成编程字符串s2,操作有三种,添加一个字符,删除一个字符,修改一个字符,则考虑采用递归方法对该问题进行求解,则要求d(A,B),设字符串A的长度为i,字符串B的长度为j,将d(i,j)问题转化成求解d(i-1,j-1)加常量,至于该常量值为多少,则要根据后续分析,写出递归方程,而后进行求解。

算法描述

  1. 定义主函数main,定义两个char型数组,同时采用scanf方法键盘读入两个字符串str1与str2。
  2. 定义这样一个函数——edit(i, j),它表示第一个字符串的长度为i的子串到第二个字符串的长度为j的子串的编辑距离。则有分析可得出以下的递归方程:

(1)if i == 0 且 j == 0,edit(i, j) = 0

(2)if i == 0 且 j > 0,edit(i, j) = j

(3)if i > 0 且j == 0,edit(i, j) = i

(4)if i ≥ 1  且 j ≥ 1 ,edit(i, j) == min{ edit(i-1, j) + 1, edit(i, j-1) + 1, edit(i-1, j-1) + f(i, j) },当第一个字符串的第i个字符不等于第二个字符串的第j个字符时,f(i, j) = 1;否则,f(i, j) = 0。

  1. 同时在定义的edit函数中,动态申请一个(max1 + 1)X(max2 + 1)二维数组ptr,相当于变相建立一个矩阵,而矩阵的第一行与第一列即 ptr[0][i]和ptr[i][0]分别标注对应几行几列,进行for循环里ptr[i][0] = i和ptr[0][i] = i的赋值操作,在这个矩阵中将数组存储在第二行到第max+1行,第二列max2+1列中,则ptr[i][j]即表示从子符串str1的第1个字符到第i个字符,str2的第1个字符到第j个字符,这两个子串的编辑距离。相应的ptr[max1][max2]即为字符串str1到str2的编辑距离。
  2. 同时在edit函数中引入整型变量d,其实d的作用就是作为递归方程中f(i,j)的值,即如果str1[i-1] == str2[j-1],d为1,否则d为0,temp = min(ptr[i-1][j] + 1, ptr[i][j-1] + 1),ptr[i][j] = min(temp, ptr[i-1][j-1] + d),最后返回ptr[max1][max2]的值,打印输出即可。

算法空间复杂度及时间复杂度分析

  1. 算法时间复杂度:循环体内每循环一次,字符串长度减1,根据矩阵判断分析,如果A的字符串长度为m,B的字符串长度为n的话,矩阵m x n个元素都要进行相应判断,赋值操作,所以T(n)=O(m x n)
  2. 空间复杂度:各个变量的空间复杂度都是O(1),所以算法空间复杂度为O(1)

心得体会

此次上机实验其实主要的一个目的就是在学习了第三章动态规划之后的相关练习,体会递归方法在解决算法问题中的应用,在本次结队编程的过程中,我作为设计算法的一方,发现自己在分析问题,解决算法问题的方面还是有很多思维不严谨的地方,比如在算法设计阶段,因为自己对问题分析不全面,导致写出的递归方程可能忽略了某些特殊情况,造成了提交代码部分正确的问题,再者,自己在辅助队友将递归方程变成代码形式的时候,循环问题处理不严谨造成运行超时的问题。在本次上机实践中其实让我体会到最重要的一点就是在解决算法问题时如何不做那么多次重复计算,将算法的时间复杂度降到最小。再者在编程时,其实这一次也学习到了一些良好的代码编写规范,比如动态申请二维数组空间,在函数运行完之后,进行释放空间,这也可能是我以前没有注意的地方,学习到了挺多东西。

posted @ 2019-10-17 17:30  愿我如苔  阅读(158)  评论(0编辑  收藏  举报