编辑距离问题

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

边界问题
对于方程① 若j=1且k≠1则f[j,k]=f[j,k-1]+1 j=1且k≠1则f[j,k]=f[j,k若k=1且j≠1则f[j,k]=f[j-1,k]+1 k=1且j≠1则f[j,k]=f[j若j=1且k=1则f[1,1]=1 j=1且k=1则 对于方程② 若j=1且k≠1则f[j,k]=f[j,k-1] j=1且k≠1则f[j,k]=f[j,k若k=1且j≠1则f[j,k]=f[j-1,k] k=1且j≠1则f[j,k]=f[j若k=1且j=1则f[1,1]=0 k=1且j=1则
{这三行是处理边界问题} 这三行是处理边界问题}
{找最小} 找最小}
fid函数 fid函数
function fid:integer; var t:integer; begin if (j=1)and(k=1) then t:=0 else if j=1 then t:=f[j,k-1] t:=f[j,kelse if k=1 then t:=f[j-1,k] t:=f[jelse t:=f[j-1,k-1]; t:=f[j-1,kif t<abs(j-k) then fid:=abs(j-k) t<abs(jfid:=abs(jelse fid:=t; end; {用于方程②} 用于方程②} {t:临时变量} {t:临时变量}
题目分析
乍一看仿佛是搜索,但仔细一想,这道题 用搜索是不可能实现的(至少我是这么认 为的).那么我们就要采取新的策略:动 态规划. 我们知道,所有的动规问题都是可以分段 解决的,那么这道题也是如此.我们可以 把长的字符串拆解为短的字符串,一直拆 解到只剩下一个字符为止.
动态转移方程的推导
判断啊a 判断啊a,b两个字符的编辑距离十分简单:若a=b 两个字符的编辑距离十分简单:若a=b 则编辑距离为0;反之则为1 则编辑距离为0;反之则为1 计算字符a与长度为二的字符串b 计算字符a与长度为二的字符串b的编辑距离也不 难:首先计算a b[1]的编辑距离,记为f 难:首先计算a与b[1]的编辑距离,记为f,再判断 a与b[2]是否相同,相同则最终编辑距离为f,不同 b[2]是否相同,相同则最终编辑距离为f 则为f+1.若b的长度大于2 则为f+1.若b的长度大于2,则该规律依然成立. 注意:这里出现问题了:假如a=' 注意:这里出现问题了:假如a='a',b='aa',则它 b='aa' 们的编辑距离应为1 们的编辑距离应为1,但通过上述计算得到的结果 为0 .
动态转移方程
通过观察表格我们可以发现以下规律: 对于表格f f[j,k]表示a的前j个字符到b 对于表格f,f[j,k]表示a的前j个字符到b的前 k个字符的编辑距离 ①若a[j]≠b[k] ①若a[j]≠b[k] 则f[j,k]为f[j-1,k-1],f[j-1,k],f[j,k-1]三个数 f[j,k]为f[j-1,k-1],f[j-1,k],f[j,k-1]三个数 中最小数+1 中最小数+1 ②若a[j]=b[k] 则f[j,k]=f[j-1,k-1] f[j,k]=f[j-1,k最终结果为f[la,lb](la,lb为字符串长度) 最终结果为f[la,lb](la,lb为字符串长度)
{推演二维表} 推演二维表} {输出结果} 输出结果}

function min:integer; var t:integer; begin if (j=1)and(k=1) then min:=0 else if j=1 then min:=f[j,k-1] min:=f[j,kelse if k=1 then min:=f[j-1,k] min:=f[jelse begin if f[j-1,k]>f[j,k-1] then t:=f[j,k-1] f[j-1,k]>f[j,kt:=f[j,kelse t:=f[j-1,k]; t:=f[jif f[j-1,k-1]<t then min:=f[j-1,k-1] f[j-1,kmin:=f[j-1,kelse min:=t; end; end; {用于方程①} 用于方程①} {t:临时变量} {t:临时变量}
{数组长度} 数组长度} {存放字符串,string型存不到1万} 存放字符串,string型存不到1 {动态规划二维表} 动态规划二维表} {a,b字符串} {a, 字符串} {动规二维表} 动规二维表} {la,lb字符串长度,j,k循环控制 {la,lb字符串长度,j 变量} 变量}
min函数 min函数
{处理边界问题} 处理边界问题} {处理注意事项} 处理注意事项}
程序主体
la:=0; lb:=0; repeat inc(la); read(a[la]); until eoln; readln(b[1]); repeat inc(lb); read(b[lb]); until eoln; for j:=1 to la do for k:=1 to lb do if a[j]=b[k] then f[j,k]:=fid else f[j,k]:=min+1; writeln(f[la,lb]); {初始化变量} 初始化变量} {读取字符串a,记录长度} 读取字符串a,记录长度} {读取空行} 读取空行} {读取字符串b,记录长度} 读取字符串b,记录长度}
注意
这里我们要明确一点,对于任意两字符串a 这里我们要明确一点,对于任意两字符串a, b,它们的编辑距离不可能小于它们的长度 之差的绝对值.因为对于三种基本操作, 它们对字符串长度的影响为± 它们对字符串长度的影响为±1(插入和删 除)或0 除)或0(修改). 举一个例子:a的长度la=9, 的长度lb=15 举一个例子:a的长度la=9,b的长度lb=15 则a,b的编辑距离m≥abs(la-lb) 的编辑距离m≥abs(la即m≥6
程序设定
program bjjl; const i_f='bjjl.in';Baidu Nhomakorabeao_f='bjjl.out'; maxx=10000; type sz=array[1..maxx]of char; dt=array[1..maxx,1..maxx] of integer; var a,b:sz; f:dt; la,lb,j,k:integer;
动态转移方程的推导
解决了上面一个问题,我们继续. 刚才我们已经分析出了两个字符的编辑距 离和一个字符与一个字符串的编辑距离, 接下来便是两个字符串的编辑距离. 假如a='ab' b='cd' 假如a='ab',b='cd',则一眼就可以看出编辑 距离m=2.这是没有重复字母的情况下. 距离m=2.这是没有重复字母的情况下. 但是如果有重复字母呢?
编辑距离问题
河南省实验中学 彭勃
题目描述 假设字符串的基本操作仅为:删除一个字符,插入一个字符和将 一个字符修改成另一个字符这三种操作. 我们把进行了一次上述三种操作的任意一种操作称为进行了一步 字符基本操作. 下面我们定义两个字符串的编辑距离:对于两个字符串a 下面我们定义两个字符串的编辑距离:对于两个字符串a和b,通 过上述的基本操作,我们可以把a变成b 变成a,那么字符串a 过上述的基本操作,我们可以把a变成b或b变成a,那么字符串a变成 字符串b需要的最少基本字符操作步数称为字符串a和字符串b 字符串b需要的最少基本字符操作步数称为字符串a和字符串b的编辑 距离. 例如:a="ABC",b="CBCD",则a与b的编辑距离为2. 例如:a="ABC",b="CBCD" 的编辑距离为2 你的任务就是:编写一个快速的程序来计算任意两个字符串的编 辑距离. 输入 输入包含两行:第一行为字符串A,第二行为字符串B 输入包含两行:第一行为字符串A,第二行为字符串B. 字符串的长度不大于10000,且全为字母. 字符串的长度不大于10000,且全为字母. 输出 输出只有一行,为编辑距离. 样例输入 ABC CBCD 样例输出 2
动态转移方程的推导
我们把上面 的几种情况 绘成表格: a b c a b a b a b a b c 1 2 b 1 1 c 1 2 a 0 1 d 2 2 c 2 2 b 2 1 b 1 0 a b c a b c a b c
c 1 2 2 c 1 2 2 b 1 1 2 b 1 1 2 b 2 1 2 a 1 2 3 a 1 2 2 c 2 2 1 a 2 2 2 c 2 2 2 c 2 2 2 d 3 3 2
动态转移方程的推导
若a='ab',b='bc',则它们的编辑距离m=2 a='ab' b='bc',则它们的编辑距离m=2 若a='ab',b='cb',则它们的编辑距离m=1 a='ab' b='cb',则它们的编辑距离m=1 若a='ab',b='ab',则它们的编辑距离m=0 a='ab' b='ab',则它们的编辑距离m=0 若a='abc',b='cba',则它们的编辑距离m=2 a='abc' b='cba',则它们的编辑距离m=2 若a='abc',b='cab',则它们的编辑距离m=2 a='abc' b='cab',则它们的编辑距离m=2 若a='abc',b='bac',则它们的编辑距离m=2 a='abc' b='bac',则它们的编辑距离m=2 若a='abc',b='bcd',则它们的编辑距离m=2 a='abc' b='bcd',则它们的编辑距离m=2 这有什么规律呢?
相关文档
最新文档