• 文本比较算法Ⅸ——PrimalDual算法


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

  • 相关阅读:
    IOS中的国际化的使用(Xcode 6.0之后的使用步骤)
    KVC,KVO的区别和使用
    通知,代理,block 单例的使用和区别
    NSoperation的使用
    多线程之Nsthread的使用方法
    多线程的之GCD的介绍
    IOS中生成证书、真机调试、上线发布程序的步骤
    IOS之NavigationController跳转到指点的界面
    IOS之截取字符串的使用方法
    ios 之定时器的使用的技巧(结合runloop)使用
  • 原文地址:https://www.cnblogs.com/grenet/p/1987172.html
Copyright © 2020-2023  润新知