算法第三章上机实践报告

实践题目名称:编辑距离问题


问题描述: 

有两个字符串A和B,字符串转化的操作有三种,分别是:(1)删除一个字符; (2)插入一个字符; (3)将一个字符改为另一个字符,即替换。 求将字符串A变换为字符串B所用的最少字符操作数。

 


算法描述:

// 采用动态规划的思想。

// 用二维dp数组记录子问题的解,并通过循环实现子问题求解到原问题求解的扩展。

定义状态:dp[i][j] :表示 a[1~i]、b[1~j] 的最小编辑距离。

// 原问题转化为:求dp[n][m]的值。// n 表示 A字符串 的长度;m 表示 B字符串 的长度。

定义递归方程:

如果 a[i] = b[j],则 c[i][j] = c[i-1][j-1];

如果 a[i] ≠ b[j],则 c[i][j] = max({c[i-1][j-1] + 1, c[i-1][j] + 1, c[i][j-1] + 1});

// 解释:c[i-1][j-1] + 1 表示替换操作的处理;c[i][j-1] + 1 表示插入操作的处理;c[i-1][j] + 1 表示删除操作的处理。

 


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

时间复杂度:O(nm)

// n 表示 字符串 A 的大小;m 表示 字符串 B 的大小。算法需要两层循环,一层遍历字符串A,一层遍历字符串B。

空间复杂度:O(nm)

// 算法需要二维dp数组保留子问题的解。

 


 心得体会:

1.对于一些问题,要学会用递归的角度、思维去认识问题以及解决问题。

2.采用动态规划法,在代码实现时,通常要用到数组去保存子问题的解,通常要用到循环去推进子问题一步步扩展到原问题。

 

动态规划法的个人体会和思考:

1.采用动态规划解题时,非常关键的一步是要确定好 状态 以及 状态转移方程。

2.动态规划法本质上是避免子问题重复计算,从而降低时间复杂度。为了达到避免子问题重复计算,动态规划法通常先将原问题划分为独立的不同子问题(不同阶段),再通过某种策略逐步将子问题拓展到原问题,从而求解原问题。

 

posted @ 2021-10-27 23:47  xiaomeiman  阅读(38)  评论(0编辑  收藏  举报