javascript - 距索引 0 的 Levenshtein 距离

标签 javascript algorithm recursion levenshtein-distance edit-distance

我一直在研究“算法设计手册”部分 8.2.1 通过递归编辑距离。在这一节中,Skiena 写道,“我们可以定义一个递归算法,使用字符串中的最后一个字符必须被匹配、替换、插入或删除的观察。”这让我想知道,为什么是最后一个 Angular 色?对于仅基于问题定义的任何 Angular 色来说都是如此。实际的 Levenshtein 距离算法从字符串的后面进行递归调用。为什么?没有理由你不能做相反的事情,对吧?它只是一种更简单、更优雅的语法吗?

我正在翻转算法,所以它从字符串的前面开始迭代。我的尝试如下。我知道我的实现并不完全有效(例如:minDistance("industry", "interest") 返回 5 而不是 6)。我花了几个小时试图找出我做错了什么,但我没有看到。任何帮助将不胜感激。

var matchChar = (c,d) => c === d ? 0 : 1;
var minDistance = function(word1, word2) {
    var stringCompare = function(s, t, i, j) {
        if(i === s.length) return Math.max(t.length-s.length-1,0)
        if(j === t.length) return Math.max(s.length-t.length-1,0)
        if(cache[i][j] !== undefined) {
            return cache[i][j]
        }
        let match = stringCompare(s,t,i+1,j+1) + matchChar(s[i], t[j]);
        let insert = stringCompare(s,t,i,j+1) + 1;
        let del = stringCompare(s,t,i+1,j) + 1;

        let lowestCost = Math.min(match, insert, del)
        cache[i][j] = lowestCost

        return lowestCost
    };

    let s = word1.split('')
    s.push(' ')
    s = s.join('')

    let t = word2.split('')
    t.push(' ')
    t = t.join('')

    var cache = []
    for(let i = 0; i < s.length; i++) {
        cache.push([])
        for(let j = 0; j < t.length; j++) {
            cache[i].push(undefined)
        }
    }

    return stringCompare(s, t, 0, 0)
}

最佳答案

线条

    if(i === s.length) return Math.max(t.length-s.length-1,0)
    if(j === t.length) return Math.max(s.length-t.length-1,0)

我看错了。我觉得应该是

    if(i === s.length) return t.length-j
    if(j === t.length) return s.length-i

关于javascript - 距索引 0 的 Levenshtein 距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54879752/

相关文章:

SQL - postgres - 图中的最短路径 - 递归

javascript - jQuery 获取所选对象的子对象

javascript - Dhtml 转换

.net - 将数据从一个列表添加到另一个列表的算法

algorithm - Congos TM1 中的稀疏合并算法

c++ - 包装一个接受 std::function<double(double)> 的函数,以便传递接受更多参数的函数

javascript - 为什么 Javascript addEventListener 会更改对象指针的范围?

javascript - 根据多个搜索词筛选对象数组

C++图像处理,粒子计数

python - 反转未知深度的嵌套字典