一 前言
离散序列通常是字符串序列,一个字符表示一种标签或者等级。这与定量型数据的相似性度量不同,定量型数据可以采用距离函数来度量相似度,而离散序列一般不具有数值计算的特性。故而,我们对离散序列的相似度量通常采用字符串比较的方法,本文讨论的是编辑距离和最长公共子序列。
二 编辑距离
编辑距离是将一个字符串转化为另一个字符串所使用一系列插入、删除和替换操作所需要的最小代价。 例如,将 ababab 转化成 bababa 最少需要两次:第一次删除第一个a,第二次在尾端插入一个a。假设删除和插入的成本都是1,那么 ababab 和 bababa 的编辑距离就是2。显然,编辑距离越小说明两个字符串越相似。
给定两个任意的字符序列X和Y,如何计算两者之间的编辑距离?显然,这是个动态规划的问题,需要找出它的递归模型。
设 E d i t ( i , j ) Edit(i,j) Edit(i,j)代表片段 X i X_i Xi和 Y j Y_j Yj的最小匹配代价。那么有4种可能:
- X [ i ] ! = Y [ j ] X[i]!=Y[j] X[i]!=Y[j]时, X i X_i Xi插入一个字符:插入一个字符到 X i X_i Xi的末尾,使得它和 Y j Y_j Yj的最后一个字符相等。此时匹配了一个 Y j Y_j Yj的字符, j j j指针向前移动, i i i不动。 E d i t ( i , j ) = E d i t ( i , j − 1 ) + 插 入 成 本 Edit(i,j)=Edit(i,j-1)+插入成本 Edit(i,j)=Edit(i,j−1)+插入成本。
- X [ i ] ! = Y [ j ] X[i]!=Y[j] X[i]!=Y[j]时, X i X_i Xi删除一个字符:删除 X i X_i Xi末尾的字符。此时 X [ i − 1 ] X[i-1] X[i−1]和 Y [ j ] Y[j] Y[j] 可能相等也可能不等,j不动,i指针向前移动。 E d i t ( i , j ) = E d i t ( i − 1 , j ) + 删 除 成 本 Edit(i,j)=Edit(i-1,j)+删除成本 Edit(i,j)=Edit(i−1,j)+删除成本。
- X [ i ] ! = Y [ j ] X[i]!=Y[j] X[i]!=Y[j]时, X i X_i X