在网上看到一篇博客讲解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算法实现——代码实现的更多相关文章

  1. 一个快速、高效的Levenshtein算法实现

    转自:http://www.cnblogs.com/ymind/archive/2012/03/27/fast-memory-efficient-Levenshtein-algorithm.html ...

  2. 如何快速高效地完成一个Android项目?

    本文的内容有别于之前文章中纯技术的探讨,会从业务逻辑.技术.团队和方法论的角度探讨如何快速高效地完成一个Android项目.当然,快速高效是有前提的,第一,本文依然是从研发的角度来谈如何把控项目的,而 ...

  3. 【译】快速高效学习Java编程在线资源Top 20

    想要加强你的编程能力吗?想要提升你的 Java 编程技巧和效率吗? 不用担心.本文将会提供快速高效学习 Java 编程的 50 多个网站资源: 开始探索吧: 1.MKyong:许多开发者在这里可以找到 ...

  4. 软阈值迭代算法(ISTA)和快速软阈值迭代算法(FISTA)

    缺月挂疏桐,漏断人初静. 谁见幽人独往来,缥缈孤鸿影. 惊起却回头,有恨无人省. 拣尽寒枝不肯栖,寂寞沙洲冷.---- 苏轼 更多精彩内容请关注微信公众号 "优化与算法" ISTA ...

  5. 快速高效学习Java编程在线资源Top 20(转载)

    想要加强你的编程能力吗?想要提升你的 Java 编程技巧和效率吗? 不用担心.本文将会提供快速高效学习 Java 编程的 50 多个网站资源: 开始探索吧: 1.MKyong:许多开发者在这里可以找到 ...

  6. Python实现各种排序算法的代码示例总结

    Python实现各种排序算法的代码示例总结 作者:Donald Knuth 字体:[增加 减小] 类型:转载 时间:2015-12-11我要评论 这篇文章主要介绍了Python实现各种排序算法的代码示 ...

  7. FoxOne---一个快速高效的BS框架--WEB控件属性编辑器

    FoxOne---一个快速高效的BS框架--(1) FoxOne---一个快速高效的BS框架--(2) FoxOne---一个快速高效的BS框架--(3) FoxOne---一个快速高效的BS框架-- ...

  8. FoxOne---一个快速高效的BS框架--(4)

    FoxOne---一个快速高效的BS框架--(1) FoxOne---一个快速高效的BS框架--(2) FoxOne---一个快速高效的BS框架--(3) FoxOne---一个快速高效的BS框架-- ...

  9. FoxOne---一个快速高效的BS框架--(2)

    FoxOne---一个快速高效的BS框架--(1) FoxOne---一个快速高效的BS框架--(2) FoxOne---一个快速高效的BS框架--(3) FoxOne---一个快速高效的BS框架-- ...

随机推荐

  1. 让textbox紧贴IME

    将textbox放与页面最下方,并取消ApplicationBar. IE的ApplicationBar里放个了textbox,效果很炫,最重要用户体验很好. 于是也想对自己textbox做这样的设计 ...

  2. 关于JS函数的bind

    昨天被人问到js的bind的作用是什么? 这个倒还能回答出来,bind 之后返回一个新的函数,这个函数可以保持传递的this上下文. 接着又问了,那么bind两次不同的上下文会怎样? 这个一下子就蒙了 ...

  3. python tornado nginx deployment tornado 的部署在linux Nginx服务器

    题外话: 这里分享一个链接是将Flask 和 Apache 用 mod_wsgi 来进行传唤的部署方式,在digital ocean VPS 上的. https://www.digitalocean. ...

  4. Django入门实践(三)

    Django入门实践(三) Django简单应用 前面简单示例说明了views和Template的工作过程,但是Django最核心的是App,涉及到App则会和Model(数据库)打交道.下面举的例子 ...

  5. Wcf 文件上传下载

    wcf 文件上传的例子网上很多,我也是借鉴别人的示例.wcf 文件下载的示例网上就很少了,不知道是不是因为两者的处理方式比较类似,别人就没有再上传了.在此本人做下记录备忘. UploadFile.sv ...

  6. 回收站引发ORACLE查询表空间使用缓慢

    一个哥们问我 ,他们查询 表空间使用率 跑了一个多小时,这个太坑爹了,让我 帮忙优化一下. SQL语句如下 select * from ( select ts.tablespace_name,ts.c ...

  7. NodeJs+Express实现简单的Web增删改查

    前一段时间,公司组织了一次NodeJs的技术分享,自己有幸去听了听,第一次接触NodeJs,后来经过自己学习和探索,完成了一个很简单的Web演示项目,在这里和初学者做以分享,开发工具:WebStorm ...

  8. CMake学习

    CMake学习 本篇分享一下有关CMake的一些学习心得以及相关使用. 作者:AlphaGL.版权所有,欢迎保留原文链接进行转载 :) 本文目录如下: 1.CMake介绍 2.CMake安装与使用 2 ...

  9. SVN不同图标的不同意义

    黄色感叹号(有冲突):--这是有冲突了,冲突就是说你对某个文件进行了修改,别人也对这个文件进行了修改,别人抢在你提交之前先提交了,这时你再提交就会被提示发生冲突,而不允许你提交,防止你的提交覆盖了别人 ...

  10. .Net多线程编程—同步机制

    1.简介 新的轻量级同步原语:Barrier,CountdownEvent,ManualResetEventSlim,SemaphoreSlim,SpinLock,SpinWait.轻量级同步原语只能 ...