[转自https://cs.stackexchange.com/questions/12986/sliding-window-edit-distance]
如果您有一个长度为n的长字符串和一个长度为m的较短字符串,那么让您计算较短字符串与较长字符串的所有子字符串之间的所有n-m + 1 Levenshtein distances是一个合适的重复期。长度为m?的字符串。
它实际上可以在O(nm)时间内完成吗?
答案 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