字串編輯距離,即 levenshtein 距離,是**科學家 vladimir levenshtein 提出的概念,是指從乙個字串修改到另乙個字串時,編輯單個字元所需的最少次數,編輯單個字元允許的操作有:替換、插入、刪除。
levenshtein 距離一般用來衡量兩個字串的相似度,一般來說,兩個字串的編輯距離越小,相似度越大。
levenshtein 演算法又稱編輯距離(edit distance)演算法,用於求兩個長度分別為 n、m的字串 a、b 的 levenshtein 距離,其是乙個線性動態規劃的演算法,時空複雜度均為 o(nm)。
其中,在有了編輯距離後,字串 a、b 的相似度定義為:
對於 a、b 兩個字串來說,我們先考慮極端的情況,即 a 或 b 的長度為 0 時,那麼要編輯的次數就是另乙個字串的長度。
之後,我們考慮一般情況,在 k 個操作中有:
對於刪除操作,只需將 a[i] 從 a 中移除,即可完成轉換,此時編輯次數為 k+1
對於插入操作,只需在 a[i] 後加上 b[j],即可完成轉換,此時編輯次數為 k+1
對於替換操作,只需將 a[i] 轉換為 b[j],即可完成轉換,需要注意的是,如果 a[i] 與 b[j] 相同,那麼此時編輯次數為 k,如果 a[i] 與 b[j] 不同,那麼此時編輯次數為 k+1
而為了保證將 a[1],a[2],...,a[i] 轉換為 b[1],b[2],...,b[j] 的操作次數是最少的,因此要在三種情況中取最小值,故而只需要按此邏輯進行迭代,保證每一步操作都是最小即可。
我們以字串 a:abroad 與字串 b:aboard 為例,並在計算過程中將每一步的運算元放入 i+1 行 j+1 列的二維陣列 dp 中,此時 dp[i][j] 即為將 a[1],a[2],...,a[i] 轉換為 b[1],b[2],...,b[j] 所需的最小運算元。
首先考慮極端情況,即 a 為空字串或 b 為空字串時,需要的操作此時為另一字串的長度,即:dp[i][0]=i,dp[0][j]=j
之後我們考慮一般情況,從頭到尾遍歷這個二維陣列,從第一行到最後一行,根據定義來計算 dp[i][j] 的值,即 dp[i][j] 的值由 dp[i][j] 的上方元素 dp[i-1][j]、左方元素 dp[i][j-1]、左上方元素 dp[i-1][j-1] 的值來計算得出
最後 dp[alen][blen] 即為字串 a 轉換到 b 的 levenshtein 距離。
如下圖,最終 "abroad" 與 "aboard" 的 levenshtein 距離
動態規劃 線性DP
線性dp 即線性動態規劃,不侷限於 線性時間複雜度 的一維動態規劃。與數學中的 線性空間 類似,如果乙個動態規劃演算法的 狀態 包含多個維度,但在每個維度上都具有 線性 變化的 階段 那麼該動態規劃演算法同樣稱為 線性dp 在這類問題中,需要計算的物件表現出明顯的維度以及有序性,每個狀態的求解直接構...
動態規劃 計算字串編輯距離
題目 設a 和b 是2 個字串。要用最少的字元操作將字串a 轉換為字串b。這裡所說的字元操作包括 1 刪除乙個字元 2 插入乙個字元 3 將乙個字元改為另乙個字元。將字串a變換為字串b 所用的最少字元運算元稱為字串a到b 的編輯距離,記為d a,b 試設計乙個有效演算法,對任給的2 個字串a和b,計...
動態規劃 線性dp 初級
攔截飛彈 洛谷p1020 飛彈攔截 o n logn 的解法 dilworth定理 定理1 令 x,是乙個有限偏序集,並令r是其最大鏈的大小。則x可以被劃分成r個但不能再少的反鏈。其對偶定理稱為dilworth定理 定理2 令 x,是乙個有限偏序集,並令m是反鏈的最大的大小。則x可以被劃分成m個但不...