1. 程式人生 > >字串編輯距離之LevenshteinDistance

字串編輯距離之LevenshteinDistance

概述

Levenshtein Distance是一個度量兩個字元序列之間差異的字串度量標準,兩個單詞之間的Levenshtein Distance是將一個單詞轉換為另一個單詞所需的單字元編輯(插入、刪除或替換)的最小數量。Levenshtein Distance是1965年由蘇聯數學家Vladimir Levenshtein發明的。Levenshtein Distance也被稱為編輯距離(Edit Distance)。

定義

對於兩個字串ab,長度分別為\left | a \right |\left | b \right |,它們的Levenshtein Distance \operatorname{lev}_{a,b}(|a|,|b|)為:

\operatorname{lev}_{a,b}(i,j)=\left\{\begin{matrix} max(j,j)& \text{if min}(i,j)=0\\ min\left\{\begin{matrix} \operatorname{lev}_{a,b}(i-1,j)+1 \\ \operatorname{lev}_{a,b}(i,j-1)+1 \\ \operatorname{lev}_{a,b}(i-1,j-1)+1_{(a_{i}\neq b_{j})} \end{matrix}\right.& \text{otherwise} \end{matrix}\right.

其中當a_{i}=b_{j}時,1_{(a_{i}\neq b_{j})}為0,否則為1。\operatorname{lev}_{a,b}(i,j)就是a的前i個字元與b的前j個字元的編輯距離。

ab的相似度Sim_{a,b}

Sim_{a,b}=1-(\operatorname{lev}_{a,b}(\left | a \right |,\left | b \right |)/max(\left | a \right |,\left | b \right |))

原理

首先考慮極端情況,當ab長度為0時,那麼需要編輯的次數就是裡一個字串的長度。

然後再考慮一般情況,此時分為三種情況:

  1. 在k個操作中,將a[1...i]轉換為b[1...j-1]
  2. 在k個操作中,將a[1...i-1]轉換為b[1...j]
  3. 在k個操作中,將a[1...i-1]轉換為b[1...j-1]

針對第一種情況,只需要在a[1...i]後加上字元b[j],即可完成a[1..i]到b[1...j]的轉換,總共需要的編輯次數即為k+1。

針對第二種情況,只需要在a[i]字元從a中移除,即可完成a[1..i]到b[1...j]的轉換,總共需要的編輯次數即為k+1。

針對第三種情況,只需要將a[i]轉換為b[j],即可完成a[1..i]到b[1...j]的轉換,如果a[i]與b[i]的字元相同,則總共需要的編輯次數為k,否則即為k+1。

所以上述三種情況分別對應於插入、刪除、替換操作。

為了保證將a[1..i]轉換為b[1..j]的運算元總是最少的,只需要從三種情況中選擇操作次數最少的情況,同理為了保證三種情況的運算元也是最小的,只需要按此邏輯進行迭代保證每一步的運算元都是最小的即可。

示例

為方便理解,以字串a:abroad和b:aboard為例,將求值過程中每一步的運算元放入一個i+1行j+1列的二維陣列d中,d[i,j] 即為將a[1..i]轉換為b[1...j]所需要的最少的運算元。

1.首先是極端情況,即d[0][j]、d[i][0]即a為空字串或b為空字串時,需要操作的次數即為另一字串的長度。

2.然後是一般情況,即d[i][j]的值,遍歷這個二維陣列,從第一行開始直到最後一行,由定義可知d[i][j]的值為d[i-1][j]+1、d[i][j-1]+1以及d[i-1][j-1]+1(如果a[i]==b[j])的最小值。即根據d[i][j]所在位置的正上方(d[i-1][j])、左方以(d[i-1][j])及左上方(d[i-1][j-1])的值計算出d[i][j]的值,由此得到二維陣列中所有元素的值。

3.最後的d[i][j]即為字串a轉換為b的最少運算元。

求值過程如下圖:
 

Levenshtein Distance

如圖字串ab的Levenshtein Distance \operatorname{lev}_{a,b}(6,6)為2,相似度Sim_{a,b}為:

Sim_{a,b}=1-(\operatorname{lev}_{a,b}(6,6)/max(6,6))=0.666\cdots

相關推薦

字串編輯距離LevenshteinDistance

概述 Levenshtein Distance是一個度量兩個字元序列之間差異的字串度量標準,兩個單詞之間的Levenshtein Distance是將一個單詞轉換為另一個單詞所需的單字元編輯(插入、刪除或替換)的最小數量。Levenshtein Distance是1965年

最大子序列、最長遞增子序列、最長公共子串、最長公共子序列、字串編輯距離總結

一、最大子序列 即找出由陣列成的一維陣列中和最大的連續子序列。例如{5, -6, 4, 2}的最大子序列是{4, 2},它們的和是6。 思路:假設陣列為num,用dp[i]儲存當遍歷到num[i]時,num[0]~num[i]之間求得的最大子序列的和。 遍歷num,當遍歷到nu

程式設計師程式設計藝術-----第二十八 ~ 二十九章-----最大連續乘積子串、字串編輯距離

               第二十八~二十九章:最大連續乘積子串、字串編輯距離前言    時間轉瞬即逝,一轉眼,又有4個多月沒來更新blog了,過去4個月都在幹啥呢?對的,今2013年元旦和朋友利用業餘時間一起搭了個方便朋友們找工作的程式設計面試演算法論壇:為學論壇http://www.51weixue.c

] 找工作知識儲備(2)---陣列字串那些經典演算法:最大子序列和,最長遞增子序列,最長公共子串,最長公共子序列,字串編輯距離,最長不重複子串,最長迴文子串

作者:寒小陽 時間:2013年9月。 0、前言         這一部分的內容原本是打算在之後的字串或者陣列專題裡面寫的,但看著目前火熱進行的各家網際網路公司筆試面試中,出現了其中的一兩個內容,就隨即將這些經典問題整理整理,單寫一

編輯距離動態規劃演算法

在自然語言處理中,經常需要比較段落句子之間的相似度,其中廣泛使用的方法有空間向量模型、編輯距離方法。這裡,重點說一下編輯距離演算法,又叫Levenshtein距離。編輯距離的基本思想: 對於字串A, 最少經過幾次增、刪、改操作可以變為字串B, 其中操作的次數便是A和B之間的

字串編輯距離(Levenshtein距離)演算法

基本介紹  Levenshtein距離是一種計算兩個字串間的差異程度的字串度量(string metric)。我們可以認為Levenshtein距離就是從一個字串修改到另一個字串時,其中編輯單個字元(比如修改、插入、刪除)所需要的最少次數。俄羅斯科學家Vladimir Lev

LeetCode--Edit Distance(字串編輯距離)Python

題目: 給定兩個字串。計算這兩個字串的編輯距離。可編輯方式包含3種:插入、刪除、替換。 解題思路: 考慮使用動態規劃來解題。用output[i][j]來儲存word1[0:i]和word2[0:j]的編輯距離。則output[i][j]可以由output[i-1][j],o

LeetCode | Edit Distance(字串編輯距離

Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2. (each operation is counted as 1

字串編輯距離模板

編輯距離,⼜又稱Levenshtein距離(也叫做Edit Distance),是指兩個字串串之間,由⼀一個轉成 另⼀一個所需的少編輯操作次數。許可的編輯操作包括將⼀一個字元替換成另⼀一個字元,插⼊入⼀一個字 符,刪除⼀一個字元 #include<bits

【動態規劃】字串編輯距離(Levenshtein距離)演算法

基本介紹 Levenshtein距離是一種計算兩個字串間的差異程度的字串度量(string metric)。我們可以認為Levenshtein距離就是從一個字串修改到另一個字串時,其中編輯單個字元(比如修改、插入、刪除)所需要的最少次數。俄羅斯科學家Vladi

字串編輯距離 經典 dp

可以參考這個部落格:點選開啟連結 比較兩個字串相似度,可以通過最長公共子串,或者最長公共子序列,還有就是編輯距離。兩個字串通過插入,刪除或者修改,來達到一致,編輯距離越短,可知相似度越高。 #incl

LeetCode計算字串相似度或編輯距離EditDistance

問題描述: /** * Given two words word1 and word2, find the minimum number of steps required to * convert word1 to word2. (each oper

2018.8.17 題解 2018暑假集訓編輯距離

msu type ring clu span 插入 pan -h 俄羅斯 應該是一個很經典的題目了吧 上題面描述 概念 字符串的編輯距離,又稱為Levenshtein距離,由俄羅斯的數學家Vladimir Levenshtein在1965年提出。是指利用字符操作,

動態規劃編輯距離問題

由公式可以看出,(i-1,j)對應刪除操作,(i,j-1)對應插入操作。 可以這樣理解,現在耗費了di-1,j步操作將字串a(1,i-1)轉換成了b(1,j),則在將a(1,i)轉換成b(1,j)時,我們可以直接刪掉字元a(i), 問題變成a(1,i-1)轉換成b(1,j),從而dij就等於d

【動態規劃】最小編輯距離字串A到字串B變化最少要多少步)

最小編輯距離是一道非常經典的動態規劃問題。 設A 和B 是2 個字串。要用最少的字元操作將字串A 轉換為字串B。  這裡所說的字元操作包括  (1)刪除一個字元;  (2)插入一個字元;  (3)將一個字元改為另一個字元。  將字串A變換為字串B 所用的最少字元操作次數也稱

字串相似度演算法(編輯距離演算法 Levenshtein Distance)

在搞驗證碼識別的時候需要比較字元程式碼的相似度用到“編輯距離演算法”,關於原理和C#實現做個記錄。 據百度百科介紹: 編輯距離,又稱Levenshtein距離(也叫做Edit Distance),是指兩個字串之間,由一個轉成另一個所需的最少編輯操作次數,如果它們的距離越大,說明它們越是不同。許可

演算法介紹(3) 編輯距離演算法-字串相似度

           編輯距離,又稱Levenshtein距離,是指兩個字串之間,由一個轉成另一個所需的最少編輯操作次數。        具體的操作方法為:     

編輯距離 演算法詳述計算兩個字串差異 c++程式碼

編輯距離即從一個字串變換到另一個字串所需要的最少變化操作步驟(以字元為單位,如son到sun,s不用變,將o->s,n不用變,故操作步驟為1)。 為了得到編輯距離,我們畫一張二維表來理解,以beauty和batyu為例: 圖示如1單元格位置即是兩個單詞的第一個字元[b]比較得到的值,其值由它上方的

動態規劃編輯距離:用最少的字元操作將A變換成B

一、問題描述                 設A和B是兩個字串,長度分別為n,m要用最少的字元操作(包括字元的插入、刪除、修改),這樣的操作稱為字串A到B的操作距離,記為d(A,B)。 二、思路分析                 把求解編輯距離分為字串A從0個字元逐漸增

java實現編輯距離演算法,計算字串相似度

 這是Levenshtein Distance演算法的java實現,另外oracle 10g r2當中好像自帶了這樣的函式,utl_match包當中public class LD {  /**       * 計算向量距離       * Levenshtein Distan