编辑距离用来衡量两个串的相似度
编辑距离就是用最少的编辑操作将一个词变为另一个词,操作有三种
插入
删除
替换
如何计算最短编辑距离? 采用动态规划
字符串X长度为n
字符串Y长度为m
定义D(i,j)表示X[1,i]和Y[1,j]的最短编辑距离,则D(n,m)表示X和Y的最短编辑距离,注意这里的字符串 下标是从1开始的,而数组D的下标是从0开始的
比如 D(0,1)表示X不取,Y取第一个字符 这两个字串的聚类,显然是1,即删除Y的第一个字符即可
初始化
D(i,0)=i
D(j,0)=j
先计算i,j较小的情况下的D(i,j),然后再 利用已经计算出来的结果来计算i,j较大的情况下的D(i,j)
X(1...i)和Y(1...j)的编辑距离,要么是 已知X(1....i-1)和Y(1,j)的编辑距离的基础上,在X(1....i-1)的末尾进行增加操作
或者 在已知X(1....i)和Y(1....j-1)的编辑距离的基础上,在Y(1....j-1)的末尾进行增加操作
或者 在已知X(1....i-1)和Y(1,j-1)的编辑距离的基础上,将X的第i个字符和Y的第j个字符进行替换操作,当然,如果相同的话就不需要替换了
用公式表达出来就是
进行迭代,知道i=m,j=n为止
上面的公式里面,增加,删除,的代价设的是1,替换的代价是2
计算出编辑距离了还不够,很多时候我们需要知道两个字符串如何对上(alignment),使用回溯即可
时间复杂度
O(nm) 因为要把D矩阵每个元素都算一遍
空间复杂度
O(nm)
编辑距离可以带权,为何要加权?
比如:
拼写检查里,某些字符错写成某些字符的可能性更大。比如 e 很可能被错写成a , o很可能被错写成e. 而a和b就不太容易互相写错
生物学里,某个基因片段被添加或删除的可能性比其它的片段更大
考虑到权的编辑距离的递推式与普通的基本相同
在初始化的时候
D(0,0) = 0
D(0,i) = D(0,i-1)+insert(Y(i)) . X 一个都不取,Y取前i个字符
D(i,0) = D(i-1,0)+delete(X(i)) . X取前i个字符,Y一个都不取
注意这里的insert和delete 都是对字符串X进行的操作
递推公式
编辑距离的各种变形
1
覆盖度检测,字符串首位的差异不考虑
初始的时候不考虑插入删除成本,中间过程跟前面一样,结束条件就是某一个串到达结尾了
2 局部对比问题
对于两个串
x = x1,x2 .......xm
y=y1,y2......ym
找出它们中相似度最高的字串x' y'
例子