字符串相似度算法(编辑距离)
时间:2019-09-08
本文章向大家介绍字符串相似度算法(编辑距离),主要包括字符串相似度算法(编辑距离)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1.概念
编辑距离,指的是两个字符串之间,由一个转换成另一个所需的最少编辑操作次数。许可的编辑操作包括:(1)将一个字符替换成另一个字符,(2)插入一个字符,(3)删除一个字符。
相似度,等于“编辑距离+1”的倒数。
2.分析
设有字符串a[0...n],b[0...m]。
(1)当a[i]=b[j]时,说明这时候不需要编辑操作。编辑距离保持,即f(i,j)=f(i-1,j-1)
(2)当a[i]!=b[j]时,可以有三种编辑操作。
其中删除和插入操作,只对一个下标i或者j产生影响。如在下图中,当前匹配到(t1,t2)处,如果采用删除'g',只改变t1的下标。
其中替换操作,会对2个下标都产生影响。如在下图中,当前匹配到(t1,t2)处,如果将'g'替换成'm',则下次就需要执行(t1+1,t2+1)处。
所以可以推导出下面就是递推公式。
3.用递归求解代码
#include<stdio.h>
#include<string.h>
char *a="abcgh";
char *b="aecdgh";
int min(int t1,int t2,int t3) ///求三个数的最小值
{
int min;
min=t1<t2?t1:t2;
min=min<t3?min:t3;
return min;
}
int calculate(int i,int enda,int j,int endb)
{
int t1,t2,t3;
if(i>enda) ///i指示超过a[]的范围时
{
if(j>endb)
return 0;
else
return endb-j+1;
}
if(j>endb) ///j指示超过b[]的范围时
{
if(i>enda)
return 0;
else
return enda-i+1;
}
if(*(a+i) == *(b+j)) ///如果两个相等,则直接求下一个位置
return calculate(i+1,enda,j+1,endb);
else
{
t1=calculate(i+1,enda,j,endb); ///删除a[i]或在b中插入a[i]
t2=calculate(i,enda,j+1,endb); ///删除b[j]或在a中插入b[j]
t3=calculate(i+1,enda,j+1,endb); ///替换
return 1+min(t1,t2,t3);
}
}
int main()
{
int dis=calculate(0,strlen(a)-1,0,strlen(b)-1);
printf("dis=%d",dis);
return 1;
}
4.用动态规划求解代码
#include<stdio.h>
#include<string.h>
#define MAX 1000
int dp[MAX][MAX]; ///dp[i][j]表示当前a[0..i-1]与b[0..j-1]的编辑距离
char *a="agbgd";
char *b="ggd";
int min(int t1,int t2,int t3) ///求三个数的最小值
{
int min;
min=t1<t2?t1:t2;
min=min<t3?min:t3;
return min;
}
int main()
{
int i,j;
int lena=strlen(a),lenb=strlen(b);
memset(dp,0,sizeof(dp));
for(i=0;i<=lena;i++) ///a作为行,当b为空串时
dp[0][i]=i;
for(i=0;i<=lenb;i++) ///b作为列,当a为空串时
dp[i][0]=i;
for(i=1;i<=lena;i++)
{
for(j=1;j<=lenb;j++)
{
if(*(a+i)==*(b+j)) ///相等时
dp[i][j]=dp[i-1][j-1];
else
dp[i][j]=1+min(dp[i-1][j],dp[i][j-1],dp[i-1][j-1]); ///不相等时,取三种可能操作的最小数值+1
}
}
printf("编辑距离为:dis=%d\n",dp[lena][lenb]);
return ;
}
原文地址:https://www.cnblogs.com/myblog1993/p/11485714.html
- 如何在企业中融入机器学习
- How ASP.NET MVC Works?
- 如果没有Visual Studio 2015,我们如何创建.NET Core项目 ?
- “前.NET Core时代”如何实现跨平台代码重用 ——源文件重用
- 简析Linux主要应用领域及范围
- ASP.NET MVC Controller激活系统详解:默认实现
- 机器之心年度盘点:2017年人工智能领域度备受关注的科研成果
- 为什么GAC和VS引用的程序集不一致?
- GraphQL 浅谈,从理解 Graph 开始
- 分布式系统CAP理论
- 美媒盘点2018年将改变世界的四大技术趋势
- 如果你想深刻理解ASP.NET Core请求处理管道,可以试着写一个自定义的Server
- 路面能发电,智慧交通不遥远
- 小程序:企鹅帝国身后,微信帝国正悄悄露出冰山一角!
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Java数据类型
- Python爬虫之scrapy构造并发送请求
- Python爬虫之scrapy模拟登陆
- Python爬虫之scrapy中间件的使用
- Python爬虫之scrapy_redis原理分析并实现断点续爬以及分布式爬虫
- Python爬虫之scrapy_splash组件的使用
- Python爬虫之scrapy的日志信息与配置
- Python爬虫之scrapyd部署scrapy项目
- 最近发现一个很有趣的随机小姐姐视频源码 分享给大家
- Codeforces Round #633 (Div. 2)C Powered Addition (贪心,二进制)
- Spring 整合 JUnit
- Java Stax解析XML示例
- Codeforces Round #633 (Div. 2) B Sorted Adjacent Differences(直观感知+排序插放)
- Spring 声明式事务
- Leetcode 1320 二指输入的的最小距离(多情况讨论,DP)