博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
字符串相似度算法 递归与动态规划求解分析
阅读量:7139 次
发布时间:2019-06-28

本文共 1464 字,大约阅读时间需要 4 分钟。

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
#include
char *a="abcgh";char *b="aecdgh";int min(int t1,int t2,int t3) ///求三个数的最小值{ int min; min=t1
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
#include
#define MAX 1000int 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

 类似有: 

转载地址:http://ntlrl.baihongyu.com/

你可能感兴趣的文章
我的友情链接
查看>>
java转换是json需要的jar包导致的问题,
查看>>
mac安装brew和nginx
查看>>
技术博客
查看>>
关于ssh远程登录太慢的解决方法
查看>>
子类化QMainWindows
查看>>
Windows完成端口 IOCP模型(一)
查看>>
修改roo的密码 虚拟机vmware8.04 Centos 6.3
查看>>
Struts2 注解
查看>>
有关xerosploit运行报错问题的有效解决方案
查看>>
ABP官方文档翻译 1.4 启动配置
查看>>
js框架简明
查看>>
Java volatile 关键字
查看>>
http 头信息详解
查看>>
ATS项目更新(4) 更新DLL到远程服务器
查看>>
mac 多显示器焦点快速切换
查看>>
第六周学习进度报告
查看>>
nginx发布静态网页
查看>>
Hadoop 面试题之一
查看>>
有关方法重载的实例(例4-10)
查看>>