【问题标题】:Levenshtein Matrix using only a diagonal strip仅使用对角线的 Levenshtein 矩阵
【发布时间】:2017-06-26 01:16:15
【问题描述】:

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

"通过检查对角线而不是行,并使用惰性求值,我们可以在 O(m (1 + d)) 时间内找到 Levenshtein 距离(其中 d 是 Levenshtein 距离),这比常规的要快得多距离小的动态规划算法。”

这个解决方案是如何工作的?我很难将其可视化,因为感觉任何矩阵单元格的值都取决于上方、左侧和对角线左侧的单元格的值,所以我不确定如何遍历仅使用对角线的矩阵。

【问题讨论】:

    标签: algorithm matrix levenshtein-distance string-metric


    【解决方案1】:

    第二次尝试解释:

    假设我们要找到长度为 m 的单词和长度为 n 的单词之间的距离。令矩阵条目以[0, m] × [0, n]为索引,其中(i, j)条目表示length-m单词的length-i前缀与length-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             * * *
    

    虽然渐近运行时间是一样的。

    【讨论】:

    • 哦,我明白了!但是感觉这和检查 |w1.length - w2.length| 是一样的。
    • @NyfikenGul 我们没有在一开始就使用这个想法,而是在子问题上反复使用它。
    • 哦,我明白了。也感谢您的第二次解释,干杯伙伴!我想我现在明白了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-09
    • 2019-05-21
    • 1970-01-01
    • 2021-09-30
    • 2016-02-10
    • 1970-01-01
    相关资源
    最近更新 更多