Levenshtein Distane (萊文斯坦距離)

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。

萊溫斯坦距離越大,則表示兩個字符串的類似度越小。ide

Levenshtein distance是以俄羅斯科學家Vladimir Levenshtein,他在1965年設計了這個算法,這個度量值有時也被稱爲編輯距離(edit distance)設計

用途:code

  • 拼寫檢查(spell checking)
  • 語音識別(speech recognition)
  • DNA分析(DNA analysis)
  • 抄襲檢測

算法步驟(algorithm)

String s;
String t;

int n = s.length()
int m = t.length()
int cost = 0;
  1. n是字符串s的長度,m是字符串t的長度
    • 若是n == 0返回m
    • 若是m == 0返回n
    • 構造一個矩陣,行數(rows)是0...m,列數(columns)是0...n
  2. 初始化第一行: 0-m
    • 初始化第一列: 0-n
  3. 檢查字符串s的每一個字符(i = 1; i < n; i++)
  4. 檢查字符串t的每一個字符串(j = 1; j < n; j++)
  5. 若是s[i] == t[j]cost = 0,不然cost = 1
  6. 設置矩陣matrix 單元格d[i, j]的值爲下面三種狀況的最小值:
    1. 緊接着上面的單元格加一d[i-1, j]+1
    2. 左邊的單元格加一d[i, j-1] + 1
    3. 左上方的單元格加上costd[i - 1, j - 1] + cost
  7. 在迭代步驟(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"htm

  1. U替換成A
  2. O後面插入L

因此他們的距離是2字符串

參考

相關文章
相關標籤/搜索