專案中應用了編輯距離演算法解決問題,做個總結。作為業務團隊的同學,平時應用演算法解決問題的機會並不多,但是還是要有這個能力 / 思維,對技術架構 / 技術選型都有幫助,遇到演算法資源不足的情況,也能頂上。編輯距離演算法可以用於衡量文字相似度,進而解決文字的模糊搜尋 / 匹配問題。編輯距離又叫 levenshtein 距離(萊文斯坦距離),區別於漢明距離(等長字串對應位置的不同字元的個數),不僅可以替換字元,還可以增刪字元。演算法時間複雜度是 o(m*n),如果文字數量(t)較大,遍歷文字集合,計算關鍵字和文字 pair 的編輯距離,再做 top_k 遴選,時間複雜度為 o(m*n*t + logt*t),當 t 較大時將會存在效能問題。這個效能問題的一種解法是將萊文斯坦距離降級為漢明距離,不考慮增減字元的情況,用利用 lsh 演算法的思想進行分桶匹配,快速鎖定一些桶,只匹配這些桶內的文字,也就是快速排除一些桶,減少匹配次數,從而提公升速度。(lsh 演算法的應用下次展開)。在我的專案中,文字數量在 1w 左右,並且我們通過邊緣計算的方式化解伺服器的負載壓力,最終還是應用編輯距離演算法解決我們業務的文字模糊匹配問題。
編輯距離演算法是個經典 dp (動態規劃)問題。完美契合 dp 問題的兩大特徵,一是問題可分解為規模更小的子問題,二是子問題解之間存在推導關係。對於編輯距離求解問題,我們把 s1(長度 m ) 和 s2 (長度 n) 的編輯距離定義為 d(m, n),用 d(m-1, n) 表示 s1 的子串(移除最後乙個字元)和 s2 之間的編輯距離,同理定義 d(m, n-1) 、d(m-1, n-1),那麼問題解之間的推導關係為,d(m, n) = d(m-1, n-1) if s1[m-1] == s2[n-1],d(m, n) = min(d(m-1, n), d(m, n-1)) + 1 if s1[m-1] != s2[n-1]。基本原理就是這樣。
在實際應用的時候,我們一是對空間複雜度進行了優化(常規優化操作),二是微調演算法滿足業務需要的特定匹配規則。一,我們的直接反應會使用乙個 m*n 的二維資料儲存解空間,空間複雜度是 o(m*n),但仔細觀察一下,在推導過程中,新一行的解只依賴上一行的解,意味著我們可以只儲存上一行的解,空間複雜度可以降為 o(n)。二,在我們的專案中,s1 是乙個段落,s2 是關鍵字,我們的編輯距離並不是嚴格意義上的編輯距離,嚴格來說,我們業務需要的是 s1 的連續子串和 s2 的編輯距離,(聽起來問題複雜了好多),(業務含義是這個段落裡是不是包含了疑似 s2 的子串)。理解起來,s1 的連續子串和 s2 的編輯距離,可以轉化為 s1 向 s2 轉化(編輯 / 匹配)的過程,s1 的字首、字尾可以不參與匹配,或者說可以自由刪除 s1 的字首、字尾,而不增加編輯距離,這樣的話,我們對演算法的微調方法就出來了,1,初始化時,d(i, 0) = 0, 0 <= i < m,表示可以刪除 s1 的字首而不增加編輯距離,2,求解最終解時,取 min(d(i, n)), 0 <= i < m,表示可以刪除 s1 的字尾而不增加編輯距離。
編輯距離及編輯距離演算法
編輯距離概念描述 編輯距離,又稱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 ...