算法第三章上机实践报告
实践题目名称:编辑距离问题
问题描述:
有两个字符串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.动态规划法本质上是避免子问题重复计算,从而降低时间复杂度。为了达到避免子问题重复计算,动态规划法通常先将原问题划分为独立的不同子问题(不同阶段),再通过某种策略逐步将子问题拓展到原问题,从而求解原问题。