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

时间: 2024-09-24 09:08:40

文本比较算法Ⅸ——Primal-Dual算法的相关文章

文本比较算法Ⅱ——Needleman/Wunsch算法

在"文本比较算法Ⅰ--LD算法"中介绍了基于编辑距离的文本比较算法--LD算法. 本文介绍基于最长公共子串的文本比较算法--Needleman/Wunsch算法. 还是以实例说明:字符串A=kitten,字符串B=sitting 那他们的最长公共子串为ittn(注:最长公共子串不需要连续出现,但一定是出现的顺序一致),最长公共子串长度为4. 定义: LCS(A,B)表示字符串A和字符串B的最长公共子串的长度.很显然,LSC(A,B)=0表示两个字符串没有公共部分. Rev(A)表示反转

c-用 粒子群优化算法/细菌觅食算法 求解下列方程 C 或者C++语言或者Java都可以!

问题描述 用 粒子群优化算法/细菌觅食算法 求解下列方程 C 或者C++语言或者Java都可以! 使用 粒子群优化算法/细菌觅食算法 求解或者优化下列方程,使用C语言或者C++语言或者Java都可以! 解决方案 http://www.pudn.com/downloads311/sourcecode/math/detail1379743.html 解决方案二: 粒子群优化算法的JAVA实现 解决方案三: http://msdn.microsoft.com/zh-cn/magazine/hh8824

PHP Hash算法:Times33算法代码实例

  这篇文章主要介绍了PHP Hash算法:Times33算法代码实例,本文直接给出实现代码,需要的朋友可以参考下 最近看书,里面提到了一些Hash算法.比较有印象的是Times33,当时理解不是很透测,今天写了段程序来验证了一下. 先上代码: 复制代码 代码如下: /** * CRC32 Hash function * @param $str * @return int */ function hash32($str) { return crc32($str) >> 16 & 0x7

dijkstra标记算法-Dijkstra标记算法与Dijkstra算法的区别

问题描述 Dijkstra标记算法与Dijkstra算法的区别 请问离散数学中用Dijkstra标记算法求最短链与用Dijkstra算法求最短路径的联系 解决方案 dijkstra算法最短路径-Dijkstra算法Prim算法与Dijkstra算法的区别 解决方案二: 二者不是同一种算法吗?没有听说过迪杰斯特拉算法还分几种的啊.

遗传算法、贪婪算法、粒子群算法、蚂蚁算法概念简介

遗传算法 遗传算法是计算数学中用于解决最佳化的搜索算法,是进化算法的一种.进化算法最初是借鉴了进化生物学中的一些现象而发展起来的,这些现象包括遗传.突变.自然选择以及杂交等.遗传算法通常实现方式为一种计算机模拟.对于一个最优化问题,一定数量的候选解(称为个体)的抽象表示(称为染色体)的种群向更好的解进化.传统上,解用二进制表示(即0和1的串),但也可以用其他表示方法.进化从完全随机个体的种群开始,之后一代一代发生.在每一代中,整个种群的适应度被评价,从当前种群中随机地选择多个个体(基于它们的适应

c++面sort()是稳定的吗,里面具体用的算法是什么算法

问题描述 c++面sort()是稳定的吗,里面具体用的算法是什么算法 sort(),qsort()stable_sort()之间的区别,求解释的清楚一点,具体里面用的是什么算法,谢谢啦! 解决方案 C++快速排序之sort() 看看这篇文章吧,讲的挺详细的. 解决方案二: http://www.cppblog.com/mzty/archive/2005/12/15/1770.html 解决方案三: 不能说快速排序就是不稳定的,实际上只要在排序前记录下索引,将索引作为第二比较条件,任何排序算法都是

分布式一致性算法:Raft 算法(论文翻译)

点击我的博客查看原文. Raft 算法是可以用来替代 Paxos 算法的分布式一致性算法,而且 raft 算法比 Paxos 算法更易懂且更容易实现.本文对 raft 论文进行翻译,希望能有助于读者更方便地理解 raft 的思想.如果对 Paxos 算法感兴趣,可以看我的另一篇文章:分布式系列文章--Paxos算法原理与推导 摘要 Raft 是用来管理复制日志(replicated log)的一致性协议.它跟 multi-Paxos 作用相同,效率也相当,但是它的组织结构跟 Paxos 不同.这

《算法基础:打开算法之门》一第3章 排序算法和查找算法

第3章 Algorithms Unlocked 排序算法和查找算法 在第2章中,我们看到了在数组上进行线性查找的三个算法.我们能做得更好吗?答案是:看情况.如果不清楚数组中的元素是否有序,我们是不可能做得更好的.在最坏情况下,我们必须查找数组的所有n个元素,因为如果在前n-1个元素中不能找到要找的值,那么要查找的元素可能在第n个位置上.因此,当我们不清楚数组中的元素是否有序时,我们不可能实现比Θ(n)更好的最坏情况运行时间. 然而,假定数组是以非递减顺序排序的,那么根据"非递减"的含义

【C/C++学院】0907-象棋五子棋代码分析/寻找算法以及排序算法

象棋五子棋代码分析 编译代码报错: 错误 1 error MSB8031: Building an MFC project for a non-Unicode character set is deprecated. You must change the project property to Unicode or download an additional library. See http://go.microsoft.com/fwlink/p/?LinkId=286820 for mo

搜索引擎算法原理 百度算法的原理 [

随着网络的平民化,更多人在网络上想找到自己的信息,都喜欢在搜索引擎框中打入自己想搜索的关键词,而不是像在网络的早期,去黄页等网站寻找,有效节省大量的时间.那么在我们每天通过搜索引擎来寻找我们的信息同时,你是否知道搜索引擎的简单原理,什么是搜索引擎呢?那么搜索引擎有什么算法.机密的玄机呢?    随着搜索经济的崛起,人们开始越加关注全球各大搜索引擎的性能.技术和日流量.作为企业,会根据搜索引擎的知名度以及日流量来选择是否要投放广告等:作为普通网民,会根据搜索引擎的性能和技术来选择自己喜欢的引擎查找