解編輯距離問題

2022-04-13 04:06:17 字數 2349 閱讀 6502

編輯距離(edit distance),又稱levenshtein距離,是指兩個字串之間,由乙個轉成另乙個所需的最少編輯操作次數。

許可的編輯操作包括將乙個字元替換成另乙個字元,插入乙個字元,刪除乙個字元。

例如將kitten一字轉成sitting:

sitten (k→s)

sittin (e→i)

sitting (→g)

俄羅斯科學家vladimir levenshtein在2023年提出這個概念。應用:dna分析、拼字檢查、語音辨識、抄襲偵測、相似度計算。

動態規劃經常被用來作為這個問題的解決手段之一。

整數 levenshtein距離(字串 str1[1..m], 字串 str2[1..n])

//宣告變數, d[i , j]用於記錄str1[0...i]與str2[0..j]的levenshtein距離

int d[0..m, 0..n]

//初始化

for i from 0 to m

d[i, 0] := i //刪除i個字元

for j from 0 to n

d[0, j] := j //插入j個字元

//用動態規劃方法計算levenshtein距離

for i from 1 to m} }

//返回d[m, n]

return d[m, n]

這篇我們看看最長公共子串行的另乙個版本,求字串相似度(編輯距離),我也說過了,這是乙個非常實用的演算法,在dna對比,網

頁聚類等方面都有用武之地。

一:概念

對於兩個字串a和b,通過基本的增刪改將字串a改成b,或者將b改成a,在改變的過程中我們使用的最少步驟稱之為「編輯距離」。

二:解析

可能大家覺得有點複雜,不好理解,我們試著把這個大問題拆分掉,將"字串 vs 字串「,分解成」字元 vs 字串「,再分解

成」字元 vs 字元「。

<1> 」字元「vs」字元「

這種情況是最簡單的了,比如」a「與」b「的編輯距離很顯然是1。

<2> 」字元」vs"字串"

」a「改成」ab「的編輯距離為1,「a」與「aba」的編輯距離為2。

<3>「字串」vs「字串」

「aba」和「bba」的編輯距離為1,仔細發現我們可以得出如下結論,」aba「是由23個子序列與」bba「字串求的的編輯距離集

子串行」a「和」bba「與」b「和」bba「之間的編輯距離中選出乙個最小值,然而序列a和序列b早之前我已經計算過了,這種重複計算

的問題有點像」斐波那契」,正好滿足「動態規劃」中的最優子結構和重疊子問題,所以我們決定採用動態規劃來解決。

三:公式

跟「最長公共子串行」一樣,我們採用乙個二維陣列來儲存字串x和y當前的位置的最小編輯距離。

現有兩個序列x=,y=,

設乙個c[i,j]: 儲存xi與yj的當前最小的ld。

①: 當 xi = yi 時,則c[i,j]=c[i-1,j-1];

②:當 xi != yi 時, 則c[i,j]=min;

最終我們的c[i,j]一直儲存著最小的ld。

四:**

1 usingsystem;

2 4 和 的編輯距離為:\n", str1, str2, ld());

24 }

25 }

26 27 /// 28 ///計算字串的編輯距離

29 ///

30 ///

31 public static intld()

32 38

39 for (int j = 0; j <= str2.length; j++)

40 43

44 //矩陣的 x 座標

45 for (int i = 1; i <= str1.length; i++)

46 55 else

56 65 }

66 }

67 68 //返回字串的編輯距離

編輯距離問題

問題描述 設a和b是2個字串。要用最少的字元操作將字元a轉化為字元b。字元操作包括 1 刪除乙個人字元。2 插入乙個字元。3 將乙個字元改為另乙個字元。將字串a變換為字串b所用的最少字元運算元稱為字串a到b 的編輯距離,記為d a,b 設計乙個演算法,對給定的任意兩個字串a和b計算出他們的編輯距離d...

編輯距離問題

編輯距離問題 給定兩個字串s和t,對於t我們允許三種操作 1 在任意位置新增任意字元 2 刪除存在的任意字元 3 修改任意字元 問最少操作多少次可以把字串t變成s?例如 s abcf t dbfg 那麼我們可以 1 把d改為a 2 刪掉g 3 加入c 所以答案是3。輸入 第1行 字串a a的長度 1...

編輯距離問題

給定兩個字串s和t,對於t我們允許三種操作 1 在任意位置新增任意字元 2 刪除存在的任意字元 3 修改任意字元 問最少操作多少次可以把字串t變成s?例如 s abcf t dbfg 那麼我們可以 1 把d改為a 2 刪掉g 3 加入c 所以答案是3。輸入 第1行 字串a a的長度 1000 第2行...