您的位置:首页 > 其它

字符串相似度算法和最大公共子串提取算法

2014-06-03 22:19 1306 查看


字符串相似度算法和最大公共子串提取算法

1. Levenshtein Distance

该算法又称之为 "编辑距离",用于计算两个字符串的相似程度。原理很简单,就是返回两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。次数越少,意味着字符串相似度越高。

例如将 kitten 转换成 sitting:

sitten (k→s)

sittin (e→i)

sitting (→g)

俄罗斯科学家Vladimir Levenshtein在1965年提出这个概念。

算法原理:



下面为你展示一个编辑距离计算的实例。源字符串是 "GUMBO" ,目标字符串是 "GAMBOL".

Steps 1 and 2



Steps 3 to 6 When i = 1



Steps 3 to 6 When i = 2



Steps 3 to 6 When i = 3



Steps 3 to 6 When i = 4



Steps 3 to 6 When i = 5



Step 7

编辑距离就是矩阵右下角的数字 2. 这与我们的实际计算相符. "GUMBO" 能够转换到 "GAMBOL" 通过将 "U" 替换为 "A" 和插入 "L" (1次替换 + 1次插入 = 2次改变).

C++ 算法实现Code:

2. LCS

LCS (Longest Common Subsequence) 算法用于找出两个字符串最长公共子串。

算法原理:

(1) 将两个字符串分别以行和列组成矩阵。

(2) 计算每个节点行列字符是否相同,如相同则为 1。

(3) 通过找出值为 1 的最长对角线即可得到最长公共子串。

人 民 共 和 时 代

中 0, 0, 0, 0, 0, 0

华 0, 0, 0, 0, 0, 0

人 1, 0, 0, 0, 0, 0

民 0, 1, 0, 0, 0, 0

共 0, 0, 1, 0, 0, 0

和 0, 0, 0, 1, 0, 0

国 0, 0, 0, 0, 0, 0

为进一步提升该算法,我们可以将字符相同节点(1)的值加上左上角(d[i-1, j-1])的值,这样即可获得最大公用子串的长度。如此一来只需以行号和最大值为条件即可截取最大子串。

  人 民 共 和 时 代

中 0, 0, 0, 0, 0, 0

华 0, 0, 0, 0, 0, 0

人 1, 0, 0, 0, 0, 0

民 0, 2, 0, 0, 0, 0

共 0, 0, 3, 0, 0, 0

和 0, 0, 0, 4, 0, 0

国 0, 0, 0, 0, 0, 0

C++ 算法实现Code:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐