最近看到有人在找關於文字比較的演算法,剛好最近休假,研究了一下,終於找到乙個簡單有效的演算法,和大家分享一下。
演算法本身很簡單,但是要說清楚思路和原理就比較複雜了,打算分兩次發表(明天就要上班拉!),分別對應文字比較演算法中的兩個主要問題:
1。如何確定最大匹配率;
2。如何確定最優的匹配路徑;
演算法本身是基於圖論的,太麻煩了,所以不打算介紹整個思路,只將最後的結果詳細解說給大家。有問題可以發郵件給我:[email protected]
文字比較演算法剖析(1)-如何確定最大匹配率
1. 首先,我們假設有兩個串left和right,
left="abcacadf"
right="bcxcadfesbabcaca"
為了直觀的分析問題,第一步,我用乙個**來逐個的比較left和right的每個元素:
圖中,1 表示left 和 right 的某個元素是匹配的,0, 就是不匹配了, 那麼, 現在的問題就是, 如何從**中的左上角,找到一條路徑,滿足:
1. 經過的值為"1"的單元格最多;
2. 每次只能向右,或者向下,或者向右下方移動一格;
3. 如果本次位置在值為"1"的格仔上,只能向右下方移動一格;
4. 如果移動到右邊界或者下邊界外,則終止。
2 .這其實就是乙個有條件搜尋最大權重路徑的問題。但是,這裡講的是文字匹配問題,和圖論相比,要簡單很多。因為文字是流式的,兩個文字之間的所有匹配關係一定是乙個很規則的矩陣,這比圖論中研究的情況要簡單多了。
最先想到的是什麼呢?迭代和遞迴,是不是?別著急,沒有那麼複雜的,我們來分析一下,再做打算。
我們先用手工標出從每個匹配點出發,一直到邊界能夠經過的最多匹配點個數,如下圖所示:
各位可以自己手工做做,分析數量有限的圖形,還是大腦比計算機好使。
3. 我們來分析一下,基本的思路是數學歸納法,呵呵,其實是遞迴演算法的數學原型。
邊界上的單元,不用說了,一定是最多只能找到乙個匹配點。
而對於**中的任意乙個單元, 我們用 n(l,r) 來表示,對於它,按照上面的規則,它有3個鄰接區域 a, b, c.
我們用n(l,r)來表示「將left的第l個元素和right的第r個元素匹 配後,能夠獲取的最大匹配點數」。這個表述有點難以理解,從前面的「找到乙個路徑...」的觀點出發,我們還可以這麼說明n(l,r)的含義:「從第l行 r列的單元格出發,滿足所有4個條件的路徑上能夠經過的值為"1"的單元個數」。
因為n(l,r)的下一步一定是區域a,b,c中的乙個,而且,如果(l,r)是乙個匹配點,只能選擇進入a區域;如果進入b,c,則(l,r)一定不是乙個匹配點。因此,我們可以得到:
n(l,r) = max( v(l,r)+n(區域a), n(區域b), n(區域c) ) 。"v(l,r)表示單元(l.r)的值,=0表示單元(l,r)不是乙個匹配點,=1表示單元(l,r)是乙個匹配點"
而乙個區域的最大匹配點數,就是從該區域的入口點出發,所能得到的最大匹配點數,即:n(區域[(a,b),(c,d)]) = n(a,b). "區域[(a,b),(c,d)]的意思是:由點(a,b) 和點(c,d)所構成的矩形區域)"
那麼,前式就變成了:
n(l,r) = max( v(l.r)+n(區域a), n(區域b), n(區域c) )
= max( n(l+1,r+1)+v(l,r) , n(l,r+1), n(l+1,r))
在excel中,我們可以驗證一下,設定單元格l4的公式=max(l5,m5+b4,m4),然後拷貝這個公式直到和前面的矩陣相匹配,我們得到的結果如下:
可以和手工分析的結果對照一下(上圖中最右部分),可以看到,結果完全一致。
yes! 現在已經接近大功告成拉!簡單吧!現在,就是如何**化的問題了。
要將上面的方法程式設計,還差乙個問題:初始化。這個很簡單,從excel的計算結果我們就可以知道。在上面的單元格公式中,邊界單元引用了空白單元,而我們知道excel對空白單元取值做算術運算時是按照0計算的,所以初始化為0就可以了。
再從上面的分析可以知道:
1. 迴圈應該是從右向左,從下向上的;
2. 每個單元格的值只需要計算一次;
3. 計算n(l,r)時,需要引用3個值
因此,程式應該做逆序迴圈,用乙個陣列快取n(l+1,r)和n(l+1,r+1)的值,用乙個臨時變數快取n(l,r+1).
假設left有m個元素;right有n個元素,那麼,這個程式的時間複雜度就是o(m.n), 空間複雜度就是max(m,n).
好了,關於如何計算left和right的最大匹配數,就結束了。很簡單,不是麼?
如果想做乙個檔案比較工具的話,還需要確定最優的匹配路徑。這個打算在下次再說,演算法也比較簡單,不過現在已經11點多了,明天要早起嘍!
《轉》文字比較演算法剖析(2) 如何確定最優匹配路徑
上回說到,如何確定最大匹配數。接下來,本次將簡述如何確定最優匹配路徑。仿照確定最大匹配數的演算法,這個問題也非常容易解決,不知道這周當中,有沒有哪位 xdjm 已經有了自己的解決方案呢?有問題可以發郵件給我 calriones hotmail.com 文字比較演算法剖析 2 如何確定最優匹配路徑 確...
文字比較演算法剖析(1) 如何確定最大匹配率
最近看到有人在找關於文字比較的演算法,剛好最近休假,研究了一下,終於找到乙個簡單有效的演算法,和大家分享一下。演算法本身很簡單,但是要說清楚思路和原理就比較複雜了,打算分兩次發表 明天就要上班拉!分別對應文字比較演算法中的兩個主要問題 1。如何確定最大匹配率 2。如何確定最優的匹配路徑 文字比較演算...
文字比較演算法 Nakatsu演算法
在 文字比較演算法 ld演算法 文字比較演算法 needleman wunsch演算法 中介紹的ld演算法和lcs演算法都是基於動態規劃的。它們的時間複雜度o mn 空間複雜度o mn 在基於計算匹配字串情況下,是不可優化的。如果只是計算ld和lcs,空間占用可以優化到o m nakatsu演算法在...