日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

一个快速、高效的Levenshtein算法实现

發布時間:2025/4/5 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一个快速、高效的Levenshtein算法实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉自:http://www.cnblogs.com/ymind/archive/2012/03/27/fast-memory-efficient-Levenshtein-algorithm.html

?

Levenshtein算法,用于計算兩個字符串之間的Levenshtein距離。而Levenshtein距離又稱為編輯距離,是指兩個字符串之間,由一個轉換成另一個所需的最少編輯操作次數。許可的編輯操作包括將一個字符替換成另一個字符,插入一個字符,刪除一個字符。

概述

Levenshtein距離用來描述兩個字符串之間的差異。我在一個網絡爬蟲程序里面使用這個算法來比較兩個網頁之間的版本,如果網頁的內容有足夠多的變動,我便將它更新到我的數據庫。

說明

原來的算法是創建一個大小為StrLen1*StrLen2的矩陣。如果所有字符串加起來是1000個字符那么長的話,那么這個矩陣就會是1M;如果字符串是10000個字符,那么矩陣就是100M。如果元素都是整數(這里是指數字,Int32)的話,那么矩陣就會是4*100M == 400MB這么大,唉……

現在的算法版本只使用2*StrLen個元素,這使得后面給出的例子成為2*10,000*4 = 80 KB。其結果是,不但內存占用更少,而且速度也變快了!因為這使得內存分配只需要很少的時間來完成。當兩個字符串的長度都是1k左右時,新算法的效率是舊算法的兩倍!

示例

原來的版本將會創建一個矩陣[6+1, 5+1],而我的新算法將會創建兩個向量[6+1](黃色元素)。在這兩個算法版本中,字符串的順序是無關緊要、無所謂的,也就是說,它也可以是矩陣[5+1, 6+1]和兩個向量[5+1]。

新的算法

步驟

步驟說明
1設置n為字符串s的長度。("GUMBO")?
設置m為字符串t的長度。("GAMBOL")?
如果n等于0,返回m并退出。
如果m等于0,返回n并退出。
構造兩個向量v0[m+1] 和v1[m+1],串聯0..m之間所有的元素。
2初始化 v0 to 0..m。
3檢查 s (i from 1 to n) 中的每個字符。
4檢查 t (j from 1 to m) 中的每個字符
5如果 s[i] 等于 t[j],則編輯代價為 0;
如果 s[i] 不等于 t[j],則編輯代價為1。
6設置單元v1[j]為下面的最小值之一:
a、緊鄰該單元上方+1:v1[j-1] + 1
b、緊鄰該單元左側+1:v0[j] + 1
c、該單元對角線上方和左側+cost:v0[j-1] + cost
7在完成迭代 (3, 4, 5, 6) 之后,v1[m]便是編輯距離的值。

本小節將演示如何計算"GUMBO"和"GAMBOL"兩個字符串的Levenshtein距離。

步驟1、2

?v0v1????
??GUMBO
?012345
G1?????
A2?????
M3?????
B4?????
O5?????
L6?????

步驟3-6,當 i = 1

?

?v0v1????
??GUMBO
?012345
G10????
A21????
M32????
B43????
O54????
L65????

步驟3-6,當 i = 2

??v0v1???
??GUMBO
?012345
G101???
A211???
M322???
B433???
O544???
L655???

步驟3-6,當 i = 3

?

???v0v1??
??GUMBO
?012345
G1012??
A2112??
M3221??
B4332??
O5443??
L6554??

步驟3-6,當 i = 4

?

????v0v1?
??GUMBO
?012345
G10123?
A21123?
M32212?
B43321?
O54432?
L65543?

步驟3-6,當 i = 5

?

?????v0v1
??GUMBO
?012345
G101234
A211234
M322123
B433212
O544321
L655432

步驟7

編輯距離就是矩陣右下角的值,v1[m] == 2。由"GUMBO"變換為"GAMBOL"的過程對于我來說是很只管的,即通過將"A"替換為"U",并在末尾追加"L"這樣子(實際上替換的過程是由移除和插入兩個操作組合而成的)。

改良

如果您確信你的字符串永遠不會超過2^16(65536)個字符,那么你可以使用ushort來表示而不是int,如果字符串少于2^8個,還可以使用byte。我覺得這個算法用非托管代碼實現的話可能會更快,但我沒有試過。

參考文獻

  • Levenshtein Distance, in Three Flavors

下載代碼請前往原文:http://www.codeproject.com/Articles/13525/Fast-memory-efficient-Levenshtein-algorithm

總結

以上是生活随笔為你收集整理的一个快速、高效的Levenshtein算法实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。