根据wikipedia,可能会对Wagner-Fischer算法进行修改,可以计算出两个词的Levenshtein距离是否低于某个阈值,这比原来的快得多,如果这就是你的全部想知道。
“通过检查对角线而不是行,并通过使用延迟评估,我们可以在O(m(1 + d))时间内找到Levenshtein距离(其中d是Levenshtein距离),这比常规快得多动态编程算法,如果距离很小。“
此解决方案如何运作?我真的很难看到它,因为感觉任何矩阵单元格的值都取决于上面的单元格的值,左边和左边的对角线,所以我不知道如何遍历矩阵仅使用斜条。
答案 0 :(得分:4)
第二次尝试解释:
假设我们找到长度为m的字和长度为n的字之间的距离。让矩阵条目由[0,m]×[0,n]索引,其中(i,j)条目表示长度为m的字的长度为i的前缀与长度为j的前缀之间的编辑距离。长度为n的单词。
我们可以将动态程序视为在有向图中找到从(0,0)到(m,n)的最短路径,其有点顶点对应于矩阵条目,长度为1的向右弧和长度为1的向下弧和length-0或length-1对角弧取决于i和j处的字符是否匹配。简而言之,这个想法是使用A*长度差启发式H(i,j)= |(m - i) - (n - j)|。然后,我们不扩展A *值大于d的节点。结果是只需要打开一些对角线:
o t h e r w o r d
t * * *
h * * *
e * * *
w * * *
o * * *
r * * *
d * * *
首次尝试解释:
每个矩阵条目(i,j)由| i - j |下限,因为这是达到该状态所需的非对角线移动数量的下限。条带是坐标(i,j)满足| i-j |的每个元素≤d,看起来像
o t h e r w o r d
t * * *
h * * * *
e * * * * *
w * * * * *
o * * * * *
r * * * * *
d * * * * *
对于d = 2.当需要离开条带的空白元素的值时,只需使用d。最后,任何≤d的条带条目都是有效的,因为空白元素只能贡献d + 1,因为条带元素的左上角邻居也在条带上。
对于不同长度的单词,我们实际上可以将参数应用于转置并限制为条带
o t h e r w o r d
t * * *
h * * *
e * * *
w * * *
o * * *
r * * *
d * * *
虽然渐近运行时间是相同的。