一个快速、高效的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框架-- ...
随机推荐
- 关于CKEditor.NET的安全性错误
关于CKEditor.NET的安全性错误 一直以来在网站上使用FCKEditor.NET文本编辑器 版本应该算是比较早的一个 在使用过程中基本上没有出现什么问题 但是自服务器的IIS(同样都是IIS6 ...
- java常用的环境变量配置
JDK配置 JAVA_HOME: C:\java\jdk1.7.0 CLASSPATH: .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar; PAT ...
- DIV+CSS命名参考
用了一段CSS布局设计网页,发现自己的命名有点混乱,完全按照自己的想法命名,虽然没什么影响,有不给别人看源文件,但是工作室有时候和团队合作完成项目的时候,就遇到麻烦了,要修改一个地方相当的费事.所以还 ...
- Httphelper工具1
[苏飞开发助手V1.0测试版]官方教程与升级报告导读部分------------------------------------------------------------------------ ...
- MapXtreme 随笔记录1
最近在用MapXtreme做项目,随笔记录备忘. 声明:PubMapPara 静态类,后缀为静态类成员变量 1.加载地图 /// <summary> /// 地图工作空间文件路径 /// ...
- 关于ActiveMQ的一点总结
ActiveMQ入门 作者:一路向北 摘要:本文主要讲述ActiveMQ的基本知识和使用方法,并简单结合spring使用ActiveMQ. 一.ActiveMQ特性和使用总览 企业消息软件从80年代起 ...
- 使用 IDEA 创建 Maven Web 项目 (三)- 编写一个简单的 WEB 应用
编写 Servlet 类 首先,需要在 java 目录下,创建一个名为 org.smart4j.chapter1 的包.然后,在该包下创建一个 HelloServlet 的类,代码如下: packa ...
- ASP.NET DropDownList FindByValue 未将对象引用设置到对象的实例 解决方法
1.粗心把DataValueField中的字段名称写错了. 2.把DataBind()写在了FindByValue()后面了,以下代码是正确顺序: BLL.Student bllStu = new B ...
- charles支持https抓包
前言 最近发现访问项目的网页偶尔会被插入广告,很有可能是运营商劫持流量插入进去的,我在家里使用的长城宽带打开非加密的网页,时不时会弹个广告窗,这个也算是中国特色了.因此计划项目上线https,抓包分析 ...
- SublimeText快捷键
在我做了一次包含一些现场编码的演示后,一些观众问我是如何操作这么快.当然这里没有唯一的答案,答案是一堆简单的快捷键和大量的实践的组合.为了回应那些询问,我觉得有必要看看我每天想都不用想且使用的快捷键. ...