文本比较算法Ⅸ——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

 

  定义三个比较运算符

      ①“∠”

          pxpy        当且仅当      ix<iy,jx<jy

      ②“⊿”

             pxpy        当且仅当      ixiy,jxjy

      ③“≦”

          pxpy        要么pxpy, 要么pxpy

 

  接下来,我们用例子阐述算法

    A481234781

    B4411327431

 

  第一步:先求出集合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中的元素按照比较运算符≦排序,得到排序序列

    p3p2p1p6p5p4p7p9p8p12p11p10p13p16p15p14

 

 

  第三步:对集合P中的元素进行分组

    在排序序列中,从头开始找出按照比较运算符排序的子序列,可以得到

      p3p2p1p10

 

    把这4个元素从队列中抽出来,组成C1组。则剩下的序列为

      p6p5p4p7p9p8p12p11p13p16p15p14

 

    再从头开始找出按照比较运算符排序的子序列,可以得到

      P6p5p4p11

 

    把这4个元素从队列中抽出来,组成C2组。则剩下的队列为

      p7p9p8p12p13p16p15p14

 

    再从头开始找出按照比较运算符排序的子序列,可以得到

      p7p8p15p14

 

    把这4个元素从队列中抽出来,组成C3组。则剩下的队列为

      p9p12p13p16

 

    再从头开始找出按照比较运算符排序的子序列,可以得到

      p9p12p13

 

    把这三个元素从队列中抽出来,组成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、 后面组的每个元素都是填充,在排序序列中比自身靠前的,同时又是前一组中最后的元素

  排序序列:p3p2p1p6p5p4p7p9p8p12p11p10p13p16p15p14

 

  例如:p6元素

    在C1组中排在p6前的元素有3个,分别是p3p2p1P13个当中最后一个。

    故 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字符串

        先从C5p16找起,p16对应p13,再从p13找寻,p13对应p8。依次类推

        p16p13p8p4p1

    则(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  万仓一黍  阅读(4347)  评论(6编辑  收藏  举报