一个快速、高效的Levenshtein算法实现——代码实现
在网上看到一篇博客讲解Levenshtein的计算,大部分内容都挺好的,只是在一些细节上不够好,看了很长时间才明白。我对其中的算法描述做了一个简单的修改。原文的链接是:一个快速、高效的Levenshtein算法实现。
我修改的内容如下:
| 步骤 | 说明 |
| 1 | 设置n为字符串s的长度。(“GUMBO”) 设置m为字符串t的长度。(“GAMBOL”) 如果n等于0,返回m并退出。 如果m等于0,返回n并退出。 构造两个向量v0[m+1] 和v1[m+1] |
| 2 | 初始化 v0,内容为0,1,2,3,…,m,初始哈v1的第0个元素为0 |
| 3 | 检查s( i from 1 to n) 中的每个字符 |
| 4 | 检查t( j from 1 to m) 中的每个字符 |
| 5 | 如果 s[i] == t[j],则编辑代价cost = 0; 如果 s[i] != t[j],则编辑代价cost = 1。 |
| 6 | 设置单元v1[j]为下面的最小值之一: a、紧邻该单元上方+1:v1[j-1] + 1 b、紧邻该单元左侧+1:v0[j] + 1 c、该单元对角线上方和左侧+cost:v0[j-1] + cost |
| 7 | 在完成迭代 (3, 4, 5, 6) 之后,v1[m]便是编辑距离的值。 |
代码示例如下:
#include <iostream>
#include <cstring>
using namespace std; int LeastInThree(int a, int b, int c) {
return a>=b?(b>=c?c:b):(a>=c?c:a);
} int CalcLevenshtein(char a[], char b[], int _aLen, int _bLen) {
int aLen = _aLen;
int bLen = _bLen;
if(aLen==) {
return bLen;
}
else if(bLen==) {
return aLen;
}
else {
int* V0 = new int[bLen+];
int* V1 = new int[bLen+];
int i = bLen;
int cost = ;
// init the V0
while(i>=) {
V0[i]=i;
i--;
}
// init the V1, but only the first element
V1[]=;
for(int j=;j<=aLen;j++) {
for(int i=;i<=bLen;i++) {
// check if inputA[i] equals to inputB[i]
// equal cost = 0;
// not cost = 1;
cost = a[j-]==b[i-]?:;
//
// V0[i-1]+cost V1[i-1]+1
// \ |
// \ |
// \ |
// \ |
// \ |
// \ |
// \ |
// V0[i]+1 ------ V1[i]
// distance from neighbor to V1[i], choose from 3 candidates
V1[i]=LeastInThree(V1[i-]+,V0[i]+,V0[i-]+cost);
}
int i=bLen;
while(i>=) {
V0[i]=V1[i];
i--;
}
V1[]=V0[]+;
}
return V1[bLen];
}
} int main(int argc, char* argv[]) {
char inputa[] = "gumbo";
char inputb[] = "gambol";
cout<<CalcLevenshtein(inputa,inputb,strlen(inputa),strlen(inputb));
return ;
}
一个快速、高效的Levenshtein算法实现——代码实现的更多相关文章
- 一个快速、高效的Levenshtein算法实现
转自:http://www.cnblogs.com/ymind/archive/2012/03/27/fast-memory-efficient-Levenshtein-algorithm.html ...
- 如何快速高效地完成一个Android项目?
本文的内容有别于之前文章中纯技术的探讨,会从业务逻辑.技术.团队和方法论的角度探讨如何快速高效地完成一个Android项目.当然,快速高效是有前提的,第一,本文依然是从研发的角度来谈如何把控项目的,而 ...
- 【译】快速高效学习Java编程在线资源Top 20
想要加强你的编程能力吗?想要提升你的 Java 编程技巧和效率吗? 不用担心.本文将会提供快速高效学习 Java 编程的 50 多个网站资源: 开始探索吧: 1.MKyong:许多开发者在这里可以找到 ...
- 软阈值迭代算法(ISTA)和快速软阈值迭代算法(FISTA)
缺月挂疏桐,漏断人初静. 谁见幽人独往来,缥缈孤鸿影. 惊起却回头,有恨无人省. 拣尽寒枝不肯栖,寂寞沙洲冷.---- 苏轼 更多精彩内容请关注微信公众号 "优化与算法" ISTA ...
- 快速高效学习Java编程在线资源Top 20(转载)
想要加强你的编程能力吗?想要提升你的 Java 编程技巧和效率吗? 不用担心.本文将会提供快速高效学习 Java 编程的 50 多个网站资源: 开始探索吧: 1.MKyong:许多开发者在这里可以找到 ...
- Python实现各种排序算法的代码示例总结
Python实现各种排序算法的代码示例总结 作者:Donald Knuth 字体:[增加 减小] 类型:转载 时间:2015-12-11我要评论 这篇文章主要介绍了Python实现各种排序算法的代码示 ...
- FoxOne---一个快速高效的BS框架--WEB控件属性编辑器
FoxOne---一个快速高效的BS框架--(1) FoxOne---一个快速高效的BS框架--(2) FoxOne---一个快速高效的BS框架--(3) FoxOne---一个快速高效的BS框架-- ...
- FoxOne---一个快速高效的BS框架--(4)
FoxOne---一个快速高效的BS框架--(1) FoxOne---一个快速高效的BS框架--(2) FoxOne---一个快速高效的BS框架--(3) FoxOne---一个快速高效的BS框架-- ...
- FoxOne---一个快速高效的BS框架--(2)
FoxOne---一个快速高效的BS框架--(1) FoxOne---一个快速高效的BS框架--(2) FoxOne---一个快速高效的BS框架--(3) FoxOne---一个快速高效的BS框架-- ...
随机推荐
- 基于easyui的webform扩展(续)
基于easyui的webform扩展(续) 回顾 <前端基于easyui的mvc扩展>.<前端基于easyui的mvc扩展(续)>.<基于easyui的webform扩展 ...
- 简单使用JSON,JavaScript读取JSON文本(三)
JavaScript 读取 JSON 文本转换为对象 JSON 最常见的用法之一,是从 web 服务器上读取 JSON 数据(作为文件或作为 HttpRequest),将 JSON 数据转换为 Jav ...
- JavaScript 面向对象编程(三)如何写类和子类
在JavaScript面向对象编程(一)原型与继承和JavaScript面向对象编程(二)构造函数和类中,我们分别讨论了JavaScript中面向对象的原型和类的概念.基于这两点理论,本篇文章用一个简 ...
- SQL Server 2008 - Cannot set a credential for principal 'sa'.
SQL Server 2008 - Cannot set a credential for principal 'sa'. 很久没有用到SQL Server了,今天有幸在帮同事解决一个SQL Serv ...
- 子PID namespace中获取父namespace中pid的方法
在那篇< 使用独立PID namespace防止误杀进程>中的最后,我碰到了一个难题,那就是父PID namespace中的进程无法使用进入子PID namespace中通过echo $$ ...
- [置顶] C语言中各种数据类型的长度 sizeof char, short, int, long, long long
这些数据类型的sizeof具体长度依赖于编译器和操作系统(32-bit or 64-bit) 1: 首先,参见c99标准 标准中没有定义这些数据类型的长度,而是定义了这些数据类型能表达的大小范围的最小 ...
- Fragment与Activity交互(使用接口)
在Fragment中: 1. // 定义一个回调接口,该Fragment所在Activity需要实现该接口// 该Fragment将通过该接口与它所在的Activity交互 { public void ...
- 结构-行为-样式-css&html横纵居中最佳实践
最近在做手机端的H5项目,有个标题是在一根横线中的,就是水平居中加垂直居中(如图一).这应该是前端开发中经常遇到的一个场景了,做的次数多了就有一些体会,我今天就总结了下这种结构的实现思路:首先,用元素 ...
- 回溯法、数独与N阶可达问题
回溯法是剪了枝的穷举,这是字面上的说法,不太好理解,不如讲解实例来的酸爽,于是引出了N阶可达问题: 有N个国家,每个国家有若干城市,小明要从中国(任意一个城市)出发,遍历所有国家(假设这个遍历顺序已经 ...
- 【APEX初步】【2】【sObjects与数据库】
由于apex是与数据库集成的.我们可以直接用apex访问数据库.每条记录就是一个SObject对象