Levenshtein Distance最小編輯距離

Levenshtein Distance是最小編輯距離的一種實現,網上搜到的一些python的實現,現在用前端的JavaScript來實現一下。什么是最小編輯距離?請看斯坦福的課件。簡單地說就是將string1變成string2需要的最少步驟。

例如string1是abc,sting2是123abc。把string1變成string2的最小編輯距離是3,即新增1,新增2,新增3。

例如string1是abc,string2是abd。把string1變成string2的最小編輯距離是1,即c替換成d。(也有的將其計算成2,先刪除c,再新增d,因此是要編輯2次)。

用Levenshtein Distance來實現最小編輯距離的算法邏輯見圖:

核心思想是用二維數組記錄每次計算的值,核心技巧當然還是遞歸。D(i-1, j) + 1代表將算法思想轉化成:將string1去掉末尾一個字符后,變成string2的最小編輯距離是多少。最終不管值是多少,還需要加1,因為之前去掉了一個字符。

同理D(i, j-1) + 1代表將算法思想轉化成:將string2去掉末尾一個字符后,變成string1的最小編輯距離是多少。最終不管值是多少,還需要加1,因為之前去掉了一個字符。

D(i-1, j-1)代表將算法思想轉化成:將string1和string2都去掉末尾一個字符后,變成相同字符串的最小編輯距離是多少。因為兩個字符串都去掉了一個字符,因此存在兩種情況:如果被去掉的字符相同,就抵消。如果不同,就+1,表示替換字符。

最終的最小編輯距離是上面3種方法求出來的值的最小值。二維數組執行計算的效果圖如下,最終的結果就是矩陣右上角的值:

JavaScript版的代碼已經上傳倉庫

static Minimum = (a, b, c) => {
    return a < b ? (a < c ? a : c) : (b < c ? b : c);
};

static LevenshteinDistance = (v1, v2) => {
    const len1 = v1.length;
    const len2 = v2.length;
    const matrix = [];  // matrix
    let i;              // iterates through v1
    let j;              // iterates through v2
    let sIndex;         // ith character of v1
    let tIndex;         // jth character of v2
    let cost;           // cost

    // Step 1
    if (len1 === 0) return len2;
    if (len2 === 0) return len1;

    // Step 2
    for (i = 0; i <= len1; i++) {
        matrix[i] = [];
        matrix[i][0] = i;
    }

    for (j = 0; j <= len2; j++) {
        matrix[0][j] = j;
    }

    // Step 3
    for (i = 1; i <= len1; i++) {
        sIndex = v1.charAt(i - 1);
        for (j = 1; j <= len2; j++) {
            tIndex = v2.charAt(j - 1);
            if (sIndex === tIndex) {
                cost = 0;
            } else {
                cost = 1;
            }

            matrix[i][j] = Demo.Minimum(
                matrix[i - 1][j] + 1,
                matrix[i][j - 1] + 1,
                matrix[i - 1][j - 1] + cost,
            );
        }
    }

    // Step 4
    return matrix[len1][len2];
};
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容