最小编辑距离问题(Edition Distance)
来源:互联网 发布:杭州少儿趣味编程 编辑:程序博客网 时间:2024/05/17 22:25
注:这篇博客讨论的算法是怎样求解两个字符串的最小编辑距离,其目的是为了下一篇的虚拟DOM,来做一个预备工作,这里主要讨论的用
什么是最小编辑距离:
给定一个长度为m和n的两个字符串,设有以下几种操作:替换(R),插入(I)和删除(D)且都是相同的操作。寻找到转换一个字符串插入到另一个需要修改的最小(操作)数量。这个数量就可以被视为最小编辑距离。如:acd与ace的
递归实现:
我们来讨论一下情况:
当
当
1. 在
2. 在
3. 更改
4. 删除
5. 删除
情况搞清楚了,代码我们非常快的就能写出:
#include <iostream>#include <cmath>using namespace std;inline int getMin (int a, int b, int c) { return min(min(a, b), c);}int calcDistance(char* A, char* B, int m, int n) { if (m == 0 && n == 0) return 0; if (m == 0) return n; if (n == 0) return m; int caseA = calcDistance(A, B, m - 1, n) + 1; int caseB = calcDistance(A, B, m, n - 1) + 1; int caseC = calcDistance(A, B, m - 1, n - 1) + (A[m] != B[n]); return getMin(caseA, caseB, caseC);}int main () { char s1[20], s2[20]; cin>>s1>>s2; cout<<calcDistance(s1, s2, strlen(s1), strlen(s2))<<endl; return 0;}
但是这种方法的缺点在哪里呢,就像求解斐波那契数列那样,递归造成了重复计算(如:我们可以在不同的递归函数中调用已经调用过的函数),我们再来看看最小编辑距离问题具有重叠子问题,最优子结构,所以我们可以用动态规划来进行求解,这样就避免了重复计算的问题。
利用动态规划:
动态规划的方式,我们只是对递归进行一下变形,也就是对我们已经求得的值进行保存,首先我们要初始化一张表出来,也就是一个二维数组,N[A.length + 1][B.length + 1]
。
形成表如图:(
我们来总结一下我们上面所述几种情况的表现,可以分为4类:
1.
2. 更改
3. 删除
4. 删除
最终
min(情况1 || 情况2, 情况3, 情况4)
的最小值,并且代码如下:
int calcDistanceDP (char* A, char* B) { int m = strlen(A), n = strlen(B); // 生成表 int *T = (int *)malloc(m * n * sizeof(int)); // 赋初始值 for (int i = 0; i <= m; i++) for (int j = 0; j <= n; j++) *(T + i * n + j) = 0; for (int i = 0; i <= m; i++) *(T + i * n) = i; for (int i = 0; i <= n; i++) *(T + i) = i; for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { int cost = (int)A[i] != B[j]; int caseA = *(T + i * n + j + 1) + 1; int caseB = *(T + (i + 1) * n + j) + 1; int caseC = *(T + i * n + j) + cost; *(T + (i + 1) * n + j + 1) = getMin(caseA, caseB, caseC); } } return *(T + m * n - 1);}
算法复杂度为
- 最小编辑距离问题(Edition Distance)
- “最小编辑距离(Minimum Edit Distance)”
- 最小编辑距离(Minimum edit distance)
- Minimum edit distance(levenshtein distance)(最小编辑距离)初探
- Levenshtein distance最小编辑距离算法实现
- Levenshtein distance最小编辑距离算法实现
- 最小编辑距离 | Minimum Edit Distance
- 72. Edit Distance 最小编辑距离
- Levenshtein distance最小编辑距离算法实现
- 最小编辑距离问题
- 编辑距离(Levenshtein Distance)
- 编辑距离(edit distance)
- 编辑距离(Levenshtein Distance)
- Levenshtein Distance(编辑距离)
- POJ3356:AGTC(最小编辑距离问题)
- 编辑距离(Edit Distance | Levenshtein距离)
- 最短编辑距离问题 : Levenshtein Distance
- stanford NLP第三课“最小编辑距离(Minimum Edit Distance)”
- 程序猿之泡妞秘籍(1) --- 第一眼如何吸引女生的注意力
- Android NDK开发篇(一):新版NDK环境搭建(免Cygwin,超级快)
- JS解析Json数据格式
- solution Of 1091. Acute Stroke (30)
- 主流大数据平台及解决方案对比
- 最小编辑距离问题(Edition Distance)
- huststore - 高性能分布式存储服务
- (JAVA+TESTNG 一)JDK,JRE,JVM区别与联系
- leetcode——Combination Sum II
- ajax的简单理解一
- 菜鸟的安卓之路。2016.06.17
- java并发编程实战笔记-死锁
- c 指针定义和引用 变量类型
- Android NDK开发篇:Java与原生代码通信(数据操作)