編輯距離演算法

2021-07-16 10:24:15 字數 3740 閱讀 2776

1.介紹:

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

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

編輯距離的演算法是首先由**科學家levenshtein

提出的,故又叫

levenshtein distance

2.用途

模糊查詢

3.實現過程

a.首先是有兩個字串

,這裡寫乙個簡單的

abc和

abe

b.將字串想象成下面的結構。

a處是乙個標記,為了方便講解,不是這個表的內容。

abc  

a   

b   

c   

abe   0

1 23 a

1 a處

b2

e 3

c.來計算a處

出得值

它的值取決於:左邊的1

、上邊的

1、左上角的

0.按照levenshtein distance

的意思:

上面的值和左面的值都要求分別

加1,這樣得到

上面的值

1+1=2

,左面的值

1+1=2。a處

處於兩個

a的交匯處

,左上角的值加

上0.這樣得到

左上角的值

0+0=0。

這是後有三個值,左邊的計算後為2

,上邊的計算後為

2,左上角的計算為

0,所以

a處 取他們裡面最小的

0.d.於是表成為下面的樣子

abc  

a  b   

c   

abe   0

1 23 a

1 0b

2 b處

e3

在b處會同樣得到三個值,左邊計算後為

3,上邊計算後為1,在

b處 由於對應的字元為a、

b的交匯處,不相等,所以左上角應該在當前值的基礎上加1

,這樣得到

1+1=2

,在(3,1,2

)中選出最小的為

b處的值。

e.於是表就更新了

abc  

a    

b   

c  abe   0

1 23 a

1 0b

2 1e

3 c處

c處 計算後:上面的值為

2,左邊的值為

4,左上角的:a和

e不相同,所以加1,即

2+1,左上角的為3。

在(2,4,3

)中取最小的為

c處 的值。

f.於是依次推得到

a b

c 0

1 23

a    

1     a處

0 d處 1 g處

2 b

2 b處 1 e處

0 h處 1 e

3 c處

2 f處 1 i處

1

i處

: 表示

abc和

abe有

1個需要編輯的操作。

這個是需要計算出來的。

同時,也獲得一些額外的資訊。

a處: 表示

a     

和a     

需要有0

個操作。字串一樣b處:

表示ab   

和a     

需要有1

個操作。c處:

表示abe 

和a     

需要有2

個操作。d處:

表示a     

和ab   

需要有1

個操作。e處:

表示ab   

和ab   

需要有0

個操作。字串一樣f處:

表示abe 

和ab   

需要有1

個操作。g處:

表示a     

和abc  

需要有2

個操作。h處:

表示ab   

和abc   

需要有1

個操作。i處:

表示abe  

和abc   

需要有1

個操作。

g.計算相似度

先取兩個字串長度的最大值maxlen

,用1-

需要運算元除maxlen

),得到相似度。

例如abc

和abe

乙個操作,長度為

3,所以相似度為

1-1/3=0.666

實現**:

public class word2word 

public static void levenshtein(string str1, string str2)

for (int a = 0; a <= len2; a++)

// 計算兩個字元是否一樣,計算左上的值

int temp;

for (int i = 1; i <= len1; i++) else

// 取三個值中最小的

dif[i][j] = min(dif[i - 1][j - 1] + temp, dif[i][j - 1] + 1,

dif[i - 1][j] + 1);

}} system.out.println("字串\"" + str1 + "\"與\"" + str2 + "\"的比較");

// 取陣列右下角的值,同樣不同位置代表不同字串的比較

system.out.println("差異步驟:" + dif[len1][len2]);

// 計算相似度

float similarity = 1 - (float) dif[len1][len2]

/ math.max(str1.length(), str2.length());

system.out.println("相似度:" + similarity);

} // 得到最小值

private static int min(int... is)

} return min;

}}

編輯距離及編輯距離演算法

編輯距離概念描述 編輯距離,又稱levenshtein距離,是指兩個字串之間,由乙個轉成另乙個所需的最少編輯操作次數。許可的編輯操作包括將乙個字元替換成另乙個字元,插入乙個字元,刪除乙個字元。例如將kitten一字轉成sitting sitten k s sittin e i sitting g 俄...

編輯距離及編輯距離演算法

include include include using namespace std const int max 1001 int maxlen max max int maxlen string str1,string str2 return maxlen len1 len2 int main ...

編輯距離及編輯距離演算法

include include include using namespace std const int max 1001 int maxlen max max int maxlen string str1,string str2 return maxlen len1 len2 int main ...