算法第三章上机实践报告
算法第三章实践报告
1.1问题描述--最短编辑距离
设A和B是2个字符串。要用最少的字符操作将字符串A转换为字符串B。这里所说的字符操作包括 (1)删除一个字符; (2)插入一个字符; (3)将一个字符改为另一个字符。 将字符串A变换为字符串B所用的最少字符操作数称为字符串A到 B的编辑距离,记为d(A,B)。 对于给定的字符串A和字符串B,计算其编辑距离 d(A,B)。
1.2 算法描述
动态规划
f[i][j] = min(f[i][j - 1] + 1 , f[i - 1][j] + 1) ;
if (a[i] == b[j]) f[i][j] = f[i - 1][j - 1] ;
else f[i][j] = min(f[i][j] , f[i - 1][j - 1] + 1) ;
1.1.1 根据最优子结构性质,列出递归方程式
for (int i = 1 ; i <= n ; i++)
for (int j = 1 ; j <= m ; j++)
{
f[i][j] = min(f[i][j - 1] + 1 , f[i - 1][j] + 1) ;//利用两层循环不断更新当前最短编辑距离 这一步是添加和删除操作
if (a[i] == b[j]) f[i][j] = f[i - 1][j - 1] ;//这一步判断当前比较的两个字符是否一样
else f[i][j] = min(f[i][j] , f[i - 1][j - 1] + 1) ;//如果不一样的话将一个字符进行替换
}
1.1.2 给出填表法中表的维度、填表范围和填表顺序。
二维 填表范围就是n行m列的矩阵 填表顺序是从每行第一列开始向最后一列发展 一行结束后进行至下一行
1.1.3 分析该算法的时间和空间复杂度
时间复杂度:n * m
空间复杂度:1
1.3 心得体会(对本次实践收获及疑惑进行总结)
常见划分依据:
最后一步是从上边来的 f(i−1,j)+w(i,j)→f(i,j)f(i−1,j)+w(i,j)→f(i,j)
最后一步是从左边来的f(i,j−1)+w(i,j)→f(i,j)f(i,j−1)+w(i,j)→f(i,j)
集合划分原则
不重复(仅约束属性是数量的情况,maxmax和minmin允许划分的集合之间有重复,例如最长公共子序列)
不遗漏(所有属性都约束)
与暴力搜索的区别
暴搜每次只能处理一种情况,因此效率低下;而动态规划的一个状态包含了若干种情况,是满足某个条件的情况集合,每次状态转移就能涉及若干情况,因此效率更高