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

本文转自万仓一黍博客园博客,原文链接:http://www.cnblogs.com/grenet/archive/2011/03/17/1987172.html,如需转载请自行联系原作者

文本比较算法Ⅸ——Primal-Dual算法相关推荐

  1. 三维等值面提取算法(Dual Contouring)

    上一篇介绍了Marching Cubes算法,Marching Cubes算法是三维重建算法中的经典算法,算法主要思想是检测与等值面相交的体素单元并计算交点的坐标,然后对不同的相交情况利用查找表在体素 ...

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

    在"文本比较算法Ⅰ--LD算法"中介绍了基于编辑距离的文本比较算法--LD算法. 本文介绍基于最长公共子串的文本比较算法--Needleman/Wunsch算法. 还是以实例说明: ...

  3. EIGRP DUAL算法

    1.EIGRP使用DUAL算法,规则为:存在FS(次优路由AD<继承路由FD),当Sucssor判断为down后,调用FS:当没有FS时,该路由进入active状态,并向所有邻居发出query. ...

  4. 条件随机场(CRF) - 4 - 学习方法和预测算法(维特比算法)

    声明: 1,本篇为个人对<2012.李航.统计学习方法.pdf>的学习总结,不得用作商用,欢迎转载,但请注明出处(即:本帖地址). 2,由于本人在学习初始时有很多数学知识都已忘记,所以为了 ...

  5. SURF算法与SIFT算法的性能比较——图像特征点检测与提取算法分析

    图像特征点提取算法的算法研究(SURF和SIFT算法) 1. 摘要 计算机视觉中,很大一部分研究集中在图像特征提取和特征生成算法上.对图像的优化,不同于一般数学问题的优化方法,图像的优化是对像素点,在 ...

  6. 数据结构与算法(5)字符串(BF算法、KMP算法及KMP算法优化)

    目录 一.BF算法(暴力算法) 二.KMP算法 三.KMP算法优化 一.BF算法(暴力算法) 一个一个往后匹配,匹配失败继续从母串下一个和头(子串的头)往后继续匹配. 虽然简单,但是需要较多的时间复杂 ...

  7. 标准K-means算法的缺陷、K-mean++初始化算法、初始化算法步骤、Kmeans++算法实现

    标准K-means算法的缺陷.K-mean++初始化算法.初始化算法步骤.Kmeans++算法实现 目录 标准K-means算法的缺陷.K-mean&

  8. Apriori算法、FP-Growth算法、顺序分析、PrefixSpan算法

    Apriori算法.FP-Growth算法.顺序分析.PrefixSpan算法 目录 Apriori算法.FP-Growth算法.顺序分析.PrefixSpan算法 Apriori算法 FP-Grow ...

  9. Java-JVM虚拟机内存垃圾回收机制gc入门:引用类型,对象标记算法,回收算法,常见的 garbage collector

    文章目录 GC的优缺点 引用的四种类型 对象标记算法 引用计数法 可达性分析法 回收算法 标记-清除算法(Mark-Sweep) 复制算法 标记-整理算法(Mark-Compact) 分代收集算法 常 ...

  10. 「AI科技」机器学习算法之K-means算法原理及缺点改进思路

    https://www.toutiao.com/a6641916717624721933/ 2019-01-03 08:00:00 K-means算法是使用得最为广泛的一个算法,本文将介绍K-mean ...

最新文章

  1. 什么是以太坊?它到底怎么运作的?
  2. 【LeetCode】two num 利用comparable接口 对对象进行排序
  3. python构造方法与java区别_一张图秒懂Java和Python的区别,你知道吗?
  4. 每天一个linux命令-touch
  5. 工业互联网 — 5G TSN
  6. 【Cocosd2d实例教程五】Cocos2d添加虚拟摇杆控制器
  7. mysql switch binlog_如何使用 Golang 处理 MySQL 的 binlog
  8. docker ip地址_理解 Docker 网络(番外) -- 《Docker 源码分析》勘误
  9. 按之字形顺序打印二叉树
  10. CSS 如何让 height:100%; 起作用
  11. 利用Python对Excel文件进行批量操作
  12. python编译安装没有c扩展_为什么在安装simplejson时得到“C扩展无法编译”?
  13. 新的DMN编辑器预览
  14. JavaScript从入门到放弃 -(四)E5 新增方法
  15. 统计单词数(信息学奥赛一本通-T1400)
  16. 微信企业号开发之-如何获取secret 序列号
  17. linux扫描后台地址,Linux如何查看和控制进程
  18. php 库下载,远程文件下载php类库
  19. 主板风扇转速测试软件,技嘉风扇转速调节及超频软件EasyTune6
  20. leg引擎适合什么系统的服务器,第一讲 LEG引擎服务端更新BLUE引擎

热门文章

  1. line-height学习与总结
  2. ASP.NET Web应用程序和ASP.NET网站的区别
  3. [原创].关于SD卡的隐藏分区的认识过程及结果
  4. 可空类型 (C# 编程指南)
  5. 关于Meminfo中MemAvailable 理解
  6. Android 网络学习之使用多线程下载,支持断点续传
  7. Linux 2.4.x 网络协议栈QoS模块(TC)的设计与实现
  8. 信号量函数(semget、semop、semctl)
  9. 数字三角形问题Java
  10. vim 查找相同行 删除向同行