算法——动态规划算法求解字符串的编辑距离
来源:互联网 发布:看皇马足球的软件 编辑:程序博客网 时间:2024/06/02 13:13
当有人让你用递归算法求解斐波那契数列以及字符串的编辑距离时,所设的陷阱都是一致的(递归调用时的重复计算),解决方案也是一致的(引入备忘录概念)。观察树形的层级调用关系,我们可以发现动态规划隐式地嵌入了一种剪枝机制。
动态规划版求解菲波那切数列
关于朴素递归求解菲波那切数列存在的重复计算的说明:
红色部分均是重复计算项,当递归调用的层次更多时,重复计算的问题更为严重。
unsigned __int64 memo[1000];unsigned __int64 fib(size_t n){ if (n<=1) return n; if (memo[n]) return memo[n]; return memo[n] = fib(n-1) + fib(n-2); // 赋值运算(=)的也存在返回值,返回值是`=`号左侧的值 // 对于第一次计算得到的值进行记录备份, // 下次如果想得到该值,先进性判断是否已经计算过了 // 如果是,直接返回,见第二个if}
动态规划版求解字符串编辑距离
我们来看朴素递归来求解字符串编辑距离时可能出现的重复计算的问题(5, 5:表示的是,源字符串和目标字符串各自的长度为5):
现在我们应用动态规划的思想对朴素递归算法进行改造,所谓动态规划,其核心有二:
状态的概念
为递归接口增加状态标识参数
i 和j :int editDist(char* src, char* dst);
改造为(引入状态的概念):
int editDist(char* src, char* dst, int i, int j);
备忘录概念
通过定义相关的结构体实现
typedef struct tagMemoRecord{ int dist; int refCount;}MEMO_RECORD;// 作为全局变量vector<vector<MEMO_RECORD>> memo(100, vector<MEMO_RECORD>(100));
int editDist(char* src, char* dst, int i, int j){ if (memo[i][j].refCount) { ++memo[i][j].refCount; return memo[i][j].dist; } int dist = 0; if (strlen(src+i) == 0) { dist = strlen(dst+j); } else if(strlen(dst+j) == 0) { dist = strlen(src+i); } else { if (src[i] == dst[j]) { dist = editDist(src, dst, i+1, j+1); } else { int editIns = editDist(src, dst, i, j+1) + 1; int editDel = editDist(src, dst, i+1, j) + 1; int editRep = editDist(src, dst, i+1, j+1) + 1; dist = std::min({editIns, editDel, editRep}); } } memo[i][j].refCount = 1; return memo[i][j].dist = dist;}
0 0
- 算法——动态规划算法求解字符串的编辑距离
- 编辑距离算法——动态规划
- 【动态规划】字符串编辑距离(Levenshtein距离)算法
- 动态规划求编辑距离——算法解题报告
- 动态规划求编辑距离——算法解题报告
- 动态规划求解编辑距离
- 计算机算法--动态规划计算编辑距离
- 编辑距离之动态规划算法
- 算法:编辑距离问题(动态规划)
- 编辑距离(Edit Distance)的动态规划算法
- 动态规划 - 字符串的编辑距离
- 动态规划算法求解最大公共字符串
- 算法:求两个字符串的levenshtein距离,动态规划。
- 动态规划 字符串编辑距离
- 动态规划求解编辑距离问题
- 动态规划求解编辑距离问题(转)
- 动态规划求解编辑距离问题
- 动态规划求解编辑距离问题
- 带搜索框的百度地图html
- python 学习 (type)
- 第13周—项目2 验证克鲁斯卡尔算法
- ubuntu 14.04 安装 Phabricator
- 指纹验证
- 算法——动态规划算法求解字符串的编辑距离
- 嵌入式学习手册-4412开发板使用手册
- SQL Server的master数据库是干什么的?
- 关于文件操作
- [python&php 网络编程]从网络时间服务器获取并打印当前时间
- angularJS学习之路(十四)---ng-form
- iOS每日一记 -----之友盟社会化分享(微信和朋友圈)
- unicode下的SetWindowTextW------unicode最好不要与C代码一起使用
- 最小生成树的普里姆算法