文字比較演算法 Nakatsu演算法

2022-01-28 16:56:57 字數 3417 閱讀 1041

在「文字比較演算法ⅰ——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 所在的位置如果該位置...