Levenshtein矩阵仅使用斜条

时间:2017-02-08 12:12:46

标签: algorithm matrix levenshtein-distance string-metric

根据wikipedia,可能会对Wagner-Fischer算法进行修改,可以计算出两个词的Levenshtein距离是否低于某个阈值,这比原来的快得多,如果这就是你的全部想知道。

“通过检查对角线而不是行,并通过使用延迟评估,我们可以在O(m(1 + d))时间内找到Levenshtein距离(其中d是Levenshtein距离),这比常规快得多动态编程算法,如果距离很小。“

此解决方案如何运作?我真的很难看到它,因为感觉任何矩阵单元格的值都取决于上面的单元格的值,左边和左边的对角线,所以我不知道如何遍历矩阵仅使用斜条。

1 个答案:

答案 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             * * *

虽然渐近运行时间是相同的。