在「文字比較演算法ⅰ——ld演算法
」、「文字比較演算法ⅱ——needleman/wunsch演算法
」中介紹的ld演算法和lcs演算法都是基於動態規劃的。它們的時間複雜度o(mn)、空間複雜度o(mn)(在基於計算匹配字串情況下,是不可優化的。如果只是計算ld和lcs,空間占用可以優化到o(m))。
nakatsu演算法在計算匹配字串的情況下,有著良好的時間複雜度o(n(m-p))和空間複雜度o(n2),而且在採取適當的優化手段時,可以將空間複雜度優化到o(n),這是乙個很誘人的結果。下面將全面介紹nakatsu演算法。
字串a和字串b,計算lcs(a,b)
定義一:設m=len(a),n=len(b),不失一般性,假設m≤n。(為後面的計算提供方便。若不滿足,交換a、b即可)
定義二:a=a1a2……am,表示a是由a1a2……am這m個字元組成
b=b1b2……bn,表示b是由b1b2……bn這n個字元組成
lcs(i,j)=lcs(a1a2……ai,b1b2……bj),其中1≤i≤m,1≤j≤n
定義三:l(k,i)表示,所有與字串a1a2……ai有長度為k的lcs的字串b1b2……bj中j的最小值。
用公式表示就是:l(k,i)=min{j} where lcs(i,j)=k
這個概念比較拗口,比較難以理解。筆者也是反覆研讀多次,才理解的。
用乙個例子來說明:a="cd",b="cefdrt"。
很明顯的是lcs(2,1)=1,lcs(2,2)=1,lcs(2,3)=1。
滿足lcs(2,j)=1這個條件的j有三個,分別是j=1、j=2、j=3。其中j最小值是1。故l(1,2)=1
為了推導l的計算,有下面幾個定理。
定理一:任意的i,1≤i≤m。有l(1,i)<l(2,i)<l(3,i)……
定理二:任意的i,1≤i≤m-1。任意的k,1≤k≤m。有l(k,i+1)≤l(k,i)
定理三:任意的i,1≤i≤m-1。任意的k,1≤k≤m-1。有l(k,i)<l(k+1,i+1)
定理四:如果l(k,i+1)存在,則l(k,i+1)的計算公式為
l(k,i+1)=min{min{j},l(k,i)} where {ai+1=bj and j>l(k-1,i)}
上面四個定理證明從略。可以從上面四個定理推導出l的計算。
故,l的計算公式為
l(1,1)=min{j} where {a1=bj}
l(1,i)=min{min{j} where {ai=bj},l(1,i-1)} 此時,i>1
l(k,i)=min{min{j} where {ai=bj and j>l(k-1,i-1)},l(k,i-1)} 此時,i>1,k>1
注:以上公式中,若找不到滿足where後面條件的j,則j=maxvalue
當i<k時,則l(k,i)=maxvalue
maxvalue是乙個常量,表示「不存在」
舉例說明:a=ggatcga,b=gaattcagtta,計算lcs(a,b)
第一步:初始化l矩陣,**中v=maxvalue。
nakatsu演算法l矩陣
i=1i=2
i=3i=4
i=5i=6
i=7 k=1
k=2v k=3vv
k=4vv
v k=5vv
vvk=6vv
vvv k=7vv
vvvv
第二步:依據上面的計算公式,計算**的其餘單元格
nakatsu演算法l矩陣
i=1i=2
i=3i=4
i=5i=6
i=7 k=111
1111
1 k=2v8
2222
2 k=3vv
11444
3 k=4vv
vv66
6 k=5vv
vvv8
7 k=6vv
vvvv
11 k=7vv
vvvv
v
第三步:在矩陣中找尋對角線
1、先找如下的對角線,對角線中有四個單元格的值是v(maxvalue)。不是本演算法的合適答案
nakatsu演算法l矩陣
i=1i=2
i=3i=4
i=5i=6
i=7 k=111
1111
1 k=2v8
2222
2 k=3vv
11444
3 k=4vv
vv66
6 k=5vv
vvv8
7 k=6vv
vvvv
11 k=7vv
vvvv
v
2、再找右邊的一條對角線。
nakatsu演算法l矩陣
i=1i=2
i=3i=4
i=5i=6
i=7 k=111
1111
1 k=2v8
2222
2 k=3vv
11444
3 k=4vv
vv66
6 k=5vv
vvv8
7 k=6vv
vvvv
11 k=7vv
vvvv
v
對角線上的所有單元格的值都不是v(maxvalue)。故本對角線就是演算法的求解。
lcs(a,b)就是對角線的長度。故lcs(a,b)=6。
本演算法的精妙之處就在於這六個單元格的值所對應的字串b的字元就是最長公共子串。
最長公共子串:b1b2b4b6b8b11=gatcga
再將最長公共子串在兩個字串中搜尋一遍,能得出字串的匹配字串。
a:gga_t
c_g__
ab:gaatt
cagtta
注:原本以為能很容易得出匹配字串。不過現在看來還需費一番周折,也是考慮不周。不過已經有大概的解決方案,留待後文介紹。
nakatsu演算法關鍵就是找尋滿足條件對角線(對角線的值沒有maxvalue),故計算的過程可以沿著對角線進行,先計算第一條對角線,看是否滿足對角線條件,滿足則退出,不滿足則繼續計算下一條對角線,直到計算出滿足條件的對角線。
假設lcs(a,b)=p,則一共需要計算m-p+1條對角線,每條對角線的比較次數為n,則nakatsu演算法的時間複雜度為o((m-p+1)n),空間複雜度為o(m2),但由於計算順序的優化,可以將空間複雜度降為o(m),這應該是令人滿意的了。有關的nakatsu演算法的優化,留待後文介紹。
若各位網友誰有更好的文字比較演算法,也歡迎寫博交流。
文字比較演算法 Nakatsu演算法
在 文字比較演算法 ld演算法 文字比較演算法 needleman wunsch演算法 中介紹的ld演算法和lcs演算法都是基於動態規劃的。它們的時間複雜度o mn 空間複雜度o mn 在基於計算匹配字串情況下,是不可優化的。如果只是計算ld和lcs,空間占用可以優化到o m nakatsu演算法在...
文字比較演算法 再議Nakatsu演算法
研究文字比較演算法已經一段時間了。把思路重新理了理。在 文字比較演算法 nakatsu演算法 中提到 對角線上的數字就是最長公共子串行的下標 在 文字比較演算法 線性空間求最長公共子串行的nakatsu演算法 中提到 每行最左邊不為v的數字就是最長公共子串行的下標 以上兩個結論,sumtec都提出了...
文字比較演算法的實現
這段時間很忙,呵呵,沒時間寫blog。前兩天看了乙個文字比較的演算法,演算法的思路我就不多說了,主要說下我的實現。演算法參考 文字比較演算法剖析 1 如何確定最大匹配率 文字比較演算法剖析 2 如何確定最優匹配路徑 我的實現步驟是 1 計算出所有可行的路徑 如下圖中,n l,r 所在的位置如果該位置...