半局部Levenshtein距离

时间:2013-07-01 19:50:59

标签: algorithm

[转自https://cs.stackexchange.com/questions/12986/sliding-window-edit-distance]

如果您有一个长度为n的长字符串和一个长度为m的较短字符串,那么让您计算较短字符串与较长字符串的所有子字符串之间的所有n-m + 1 Levenshtein distances是一个合适的重复期。长度为m?的字符串。

它实际上可以在O(nm)时间内完成吗?

2 个答案:

答案 0 :(得分:3)

计算滑动窗口的Levenshtein距离归结为计算非循环定向平面图中几对顶点之间的距离,该图看起来像这个(大写字母表示对)。

   h a y s t a c k

n  A-B-C-D-E-F-*-*
   |\|\|\|\|\|\|\|
e  *-*-*-*-*-*-*-*
   |\|\|\|\|\|\|\|
e  *-*-A-B-C-D-E-F

水平和垂直弧的成本为1;如果相应的字母匹配则对角弧的成本为0,否则为1。

由于所有配对顶点都位于无限面上,因此可以使用Klein或Cabello-Chambers's多源最短路径算法计算所需的时间距离O(mn log(mn))

要削减最终日志(实际上,它比Dijkstra算法更糟糕),你可以查看Alexander Tiskin的手稿Semi-local string comparison: Algorithmic techniques and applications,如果不是这个问题,它会处理与此类似的问题。 (可能这应该是我的主要答案,但我还没有读过它,并且知道多源最短路径技术要好得多。)

也可能有一些额外的逻辑来处理单向边缘,我的multiple-source shortest path algorithm with Klein可以达到O(mn)。

答案 1 :(得分:0)

这不完全是你问的问题,但它可能对你有帮助。

如果你想找到从短词到长词的任何子串的最小距离,那么Levenshtein距离就是一个简单的变化 Fuzzy substring matching with Levenshtein distance in Python 通常,您设置在字符串的结尾或开头添加字符的成本为0