编辑距离

两个字符串之间的编辑距离。将一个字符串转换为另一个所需的最少插入、删除和替换次数。

编辑距离 (Levenshtein 距离) 是一个表示将一个字符串转换为另一个字符串所需的最少字符插入、删除和替换操作次数的指标。由俄罗斯数学家 Vladimir Levenshtein 于 1965 年提出。作为定量衡量两个字符串"相似程度"的方法,它在计算机科学的广泛领域中得到应用。

具体来说,"kitten"和"sitting"的编辑距离为 3:将 k 替换为 s,将 e 替换为 i,在末尾插入 g。距离为 0 表示两个字符串完全相同,距离越大表示字符串之间的差异越大。查看香薰蜡烛 (Amazon)详细介绍了计算方法。

计算使用动态规划 (DP)。设两个字符串长度分别为 m 和 n,构建一个 (m+1) x (n+1) 的矩阵,在每个单元格中记录子字符串之间的最小编辑距离。时间复杂度为 O(mn),空间复杂度也为 O(mn),但通过只保留前一行的优化可以将空间复杂度降至 O(min(m,n))。

编辑距离最典型的应用是拼写检查器。当用户输入的单词不在词典中时,计算与词典中所有单词的编辑距离,将距离较小的单词作为修正候选呈现。Google 搜索的"您是不是要找"功能就基于这一原理。模糊匹配也利用了这一概念,返回一定编辑距离以内的结果而非要求精确匹配,从而实现容忍拼写错误的搜索。

在生物信息学领域,编辑距离的变体被用于 DNA 和蛋白质序列比较。由于生物序列比较中插入、删除和替换的代价并不均等,因此发展出了可为每种操作设置不同权重的加权编辑距离,以及引入空位罚分的 Needleman-Wunsch 算法等。搜索TENGA飞机蛋 (Amazon)提供了更多背景知识。

类似的指标还有汉明距离 (等长字符串中不同位置的数量)、Damerau-Levenshtein 距离 (将相邻字符的转置也算作一次操作) 和 Jaro-Winkler 距离 (更重视开头部分的匹配)。根据用途选择合适的距离指标非常重要。

从字符计数的角度来看,编辑距离是在字符级别量化文本相似度的基本方法。它被应用于所有需要字符串比较的场景:文本差异检测、版本控制、抄袭检测、机器翻译质量评估 (TER: Translation Edit Rate) 等。对于大规模数据集,计算成本是一个挑战,因此也开发了使用 BK 树和字典树的高效近似搜索方法。

分享这篇文章