研究文本比較算法有一段時間。看到Primal-Dual算法,作為不同的求LCS算法,介紹如下。
原文在《An almost-linear time and linear space algorithm for the longest common subsequence problem》
比較文本:
A=a1a2a3……am
B=b1b2b3……bn
定義集合P={(i,j)|ai=bj}
則P={p1,p2,……,pl} pk表示(ik,jk),1≤k≤l
定義三個比較運算符
①“∠”
px∠py 當且僅當 ix<iy,jx<jy
②“⊿”
px⊿py 當且僅當 ix≤iy,jx≥jy
③“≦”
px≦py 要麼px∠py, 要麼px⊿py
接下來,我們用例子闡述算法
A:481234781
B:4411327431
第一步:先求出集合P
P={P1=(1,1),P2=(1,2),P3=(1,8),P4=(3,3),P5=(3,4),P6=(3,10),P7=(4,6),P8=(5,5),
P9=(5,9),P10=(6,1),P11=(6,2),P12=(6,8),P13=(7,7),P14=(9,3),P15=(9,4),P16=(9,10)}
第二步:對集合P中的元素按照比較運算符≦排序,得到排序序列
p3≦p2≦p1≦p6≦p5≦p4≦p7≦p9≦p8≦p12≦p11≦p10≦p13≦p16≦p15≦p14
第三步:對集合P中的元素進行分組
在排序序列中,從頭開始找出按照比較運算符⊿排序的子序列,可以得到
p3⊿p2⊿p1⊿p10
把這4個元素從隊列中抽出來,組成C1組。則剩下的序列為
p6≦p5≦p4≦p7≦p9≦p8≦p12≦p11≦p13≦p16≦p15≦p14
再從頭開始找出按照比較運算符⊿排序的子序列,可以得到
P6⊿p5⊿p4⊿p11
把這4個元素從隊列中抽出來,組成C2組。則剩下的隊列為
p7≦p9≦p8≦p12≦p13≦p16≦p15≦p14
再從頭開始找出按照比較運算符⊿排序的子序列,可以得到
p7⊿p8⊿p15⊿p14
把這4個元素從隊列中抽出來,組成C3組。則剩下的隊列為
p9≦p12≦p13≦p16
再從頭開始找出按照比較運算符⊿排序的子序列,可以得到
p9⊿p12⊿p13
把這三個元素從隊列中抽出來,組成C4組。則剩下的隊列為
p16
最後一個元素p16組成C5組
將上面的分組組成如下表格
C1
C2
C3
C4
C5
p3
p2
p1
p10
p6
p5
p4
p11
p7
p8
p15
p14
p9
p12
p13
p16
L
第四步:填充上面表格的L行,填充的依據如下
1、 C1組全部填充0
2、 後面組的每個元素都是填充,在排序序列中比自身靠前的,同時又是前一組中最後的元素
排序序列:p3≦p2≦p1≦p6≦p5≦p4≦p7≦p9≦p8≦p12≦p11≦p10≦p13≦p16≦p15≦p14
例如:p6元素
在C1組中排在p6前的元素有3個,分別是p3、p2、p1。P1是3個當中最後一個。
故 p6下填充p1 。
例如:p9元素
在C3組中排在p9前的元素只有1個,是p7。
故 p9下填充p7 。
填充後的表格
C1
C2
C3
C4
C5
p3
p2
p1
p10
p6
p5
p4
p11
p7
p8
p15
p14
p9
p12
p13
p16
L
0
0
0
0
p1
p1
p1
p1
p4
p4
p11
p11
p7
p8
p8
p13
最後一步:回溯LCS字符串
先從C5中p16找起,p16對應p13,再從p13找尋,p13對應p8。依次類推
p16→p13→p8→p4→p1
則(9,10)→(7,7)→(5,5)→(3,3)→(1,1)
故LCS字符串為
a1a3a5a7a9=b1b3b5b7b10=41371
此時最佳匹配為
A:48123478_1
B:4411327431
算法完成
這個算法能夠找到至少一個LCS(注意,不一定能找到全部LCS,LCS不一定是唯一的)。但是,這個算法的空間占用為P的元素的個數,但是P的元素個數是O(n2)的。故本算法對於找最佳匹配不是一個好算法。不過對於開拓思路還是有用的,原來還可以這樣算LCS。