Levenshtein Distane (萊文斯坦距離)
Levenshtein距離(LD)是衡量兩個字符串之間的相似度,我們將稱之爲源字符串(s)和目標字符串(t)的距離是刪除,插入,或需要替換變換成t。例如,
- 如果s是test,t是test,那麼
LD(s, t) = 0
,因爲他們之前不需要轉換,字符串已經完全相同。 - 如果s是test,t是tent,那麼
LD(s, t) = 1
,因爲一次替換(將's'替換爲'n')就可以將s轉換成t。
萊溫斯坦距離越大,則表示兩個字符串的相似度越小。
Levenshtein distance是以俄羅斯科學家Vladimir Levenshtein,他在1965年設計了這個算法,這個度量值有時也被稱爲編輯距離(edit distance)
用途:
- 拼寫檢查(spell checking)
- 語音識別(speech recognition)
- DNA分析(DNA analysis)
- 抄襲檢測
算法步驟(algorithm)
String s;
String t;
int n = s.length()
int m = t.length()
int cost = 0;
n
是字符串s
的長度,m
是字符串t
的長度- 如果
n == 0
返回m
- 如果
m == 0
返回n
- 構造一個矩陣,行數(rows)是
0...m
,列數(columns)是0...n
- 如果
- 初始化第一行:
0-m
,- 初始化第一列:
0-n
- 初始化第一列:
- 檢查字符串
s
的每個字符(i = 1; i < n; i++
) - 檢查字符串
t
的每個字符串(j = 1; j < n; j++
) - 如果
s[i] == t[j]
,cost = 0
,否則cost = 1
- 設置矩陣
matrix
單元格d[i, j]
的值爲下面三種情況的最小值:- 緊接着上面的單元格加一
d[i-1, j]+1
- 左邊的單元格加一
d[i, j-1] + 1
- 左上方的單元格加上
cost
:d[i - 1, j - 1] + cost
- 緊接着上面的單元格加一
- 在迭代步驟
(3,4,5,6)
完成之後,在單元格d[n, m]
中找到距離
列子
# 兩個字符串s 和t
String s = "GUMBO";
String t = “GAMBOL”;
步驟1和步驟2
-
- G U M B O - | 0 | 1 | 2 | 3 | 4 | 5
G | 1 |
A | 2 |
M | 3 |
B | 4 |
O | 5 |
L | 6 |
步驟3到步驟6,當i=1
- | - | G | U | M | B | O |
-- | - | - | - | - | - | - |
- | 0 | 1 | 2 | 3 | 4 | 5
G | 1 | 0 |
A | 2 | 1
M | 3 | 2
B | 4 | 3
O | 5 | 4
L | 6 | 5
步驟3到步驟6,當i=2
-
- G U M B O - | 0 | 1 | 2 | 3 | 4 | 5
G | 1 | 0 | 1
A | 2 | 1 | 1
M | 3 | 2 | 2
B | 4 | 3 | 3
O | 5 | 4 | 4
L | 6 | 5 | 5
步驟3到步驟6,當i=3
-
- G U M B O - | 0 | 1 | 2 | 3 | 4 | 5
G | 1 | 0 | 1 | 2
A | 2 | 1 | 1 | 2
M | 3 | 2 | 2 | 1
B | 4 | 3 | 3 | 2
O | 5 | 4 | 4 | 3
L | 6 | 5 | 5 | 4
步驟3到步驟6,當i=4
-
- G U M B O - | 0 | 1 | 2 | 3 | 4 | 5
G | 1 | 0 | 1 | 2 | 3
A | 2 | 1 | 1 | 2 | 3
M | 3 | 2 | 2 | 1 | 2
B | 4 | 3 | 3 | 2 | 1
O | 5 | 4 | 4 | 3 | 2
L | 6 | 5 | 5 | 4 | 3
步驟3到步驟6,當i=5
-
- G U M B O - | 0 | 1 | 2 | 3 | 4 | 5
G | 1 | 0 | 1 | 2 | 3 | 4
A | 2 | 1 | 1 | 2 | 3 | 4
M | 3 | 2 | 2 | 1 | 2 | 3
B | 4 | 3 | 3 | 2 | 1 | 2
O | 5 | 4 | 4 | 3 | 2 | 1
L | 6 | 5 | 5 | 4 | 3 | 2
步驟7
得到距離在矩陣的右下角,"GUMBO"可以通過兩個步驟得到"GAMBOL"
- 把
U
替換成A
- 在
O
後面插入L
所以他們的距離是2