算法第三章上机实践报告

算法第三章实践报告

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允许划分的集合之间有重复,例如最长公共子序列)
不遗漏(所有属性都约束)

与暴力搜索的区别

暴搜每次只能处理一种情况,因此效率低下;而动态规划的一个状态包含了若干种情况,是满足某个条件的情况集合,每次状态转移就能涉及若干情况,因此效率更高

posted @ 2021-10-25 00:24  Cotton-Narco  阅读(35)  评论(0编辑  收藏  举报