算法第三章实验报告
一、实践题目
设A和B是2个字符串。要用最少的字符操作将字符串A转换为字符串B。这里所说的字符操作包括 (1)删除一个字符; (2)插入一个字符; (3)将一个字符改为另一个字符。 将字符串A变换为字符串B所用的最少字符操作数称为字符串A到 B的编辑距离,记为d(A,B)。 对于给定的字符串A和字符串B,计算其编辑距离 d(A,B)。
二、问题描述
将A字符串通过最少的步骤变成B字符串,用动态规划的方法计算其编辑距离d(A,B)
三、算法描述
1、定义一个二维数组d用于存放最小编辑距离。
2、初始化
for(int j=1;j<=lb;j++) d[0][j]=d[0][j-1]+1;
for(int i=1;i<=la;i++) d[i][0]=d[i-1][0]+1;
3、找出递归式。插入操作: d[i,j]=d[i,j-1]+1 删除操作:d[i,j]=d[i-1,j]+1 替换操作:d[i,j]=d[i-1,j]-1+1(Ai≠Bj)/0(Ai=Bj)
4、填表顺序为从上到下,从左往右。
四、算法时间复杂度以及空间复杂度的分析
算法采用动态规划的思想且通过填表的策略,设字符串A的长度为m,字符串B的长度n。则在每一步的操作中所用的时间为:
①创建二维数组:o(n);
②填表:o(m) + o(n);
③填表:o(m * n);
综上,本题所用算法的时间复杂度为o(m * n)。
而程序中开辟的辅助空间主要为二维数组d,故空间复杂度为o(m * n)。
五、心得体会
动态规划与分治法有相似之处,就是将问题分成若干个子问题求解,但是有些子问题会被计算多次,此时可以用一个表来记录已解决子问题的答案,解决动态规划问题最重要的是要找到递归式,要对问题分块分析。
六、动态规划的个人体会和思考
动态规划使用于解最优化问题,通常有4个步骤:①找出最优解的性质,并刻画其结构特征。②递归地定义最优值。③以自底向上的方式计算最优值。④根据计算最优值时得到的信息,构造最优解。