文本比较算法Ⅸ——Primal-Dual算法

  研究文本比较算法有一段时间。看到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。

posted @ 2011-03-17 16:37  万仓一黍  阅读(4435)  评论(6)    收藏  举报