导言

  最近软件安全课上,讲病毒特征码的提取时,老师讲了一下GST算法。这里就做个小总结。  

简介

基本信息  广义后缀树的英文为Generalized Suffix Tree,简称GST。

算法目的  GST算法的提出是为了解决最大公共子串问题,也就是在多个字符串中,找到他们共有的子串。

顺便说一句  

  这个问题听起来和最大公共子序列问题(LCS)有些相似,但是二者有两个不同点:

    ①一个是公共子串,一个是公共子序列,后者可以是不连续的;

    ②GST算法可以对多个字符串求公共子串,而我们一般指的LCS算法只能对两个字符串求公共子序列。

  下面继续介绍GST。

原理

  后缀树,顾名思义,是一个字符串的所有后缀构成的一棵树。那么我们为什么要把一个字符串的所有后缀,提取出来呢?

  对于"p in S?"这个问题,我们假设S=rpq,这时我们看到pq是S的后缀,p为S的后缀pq的前缀。

  也就是说,如果p在S中出现,那么我们一定能找到S的一个后缀,使得p是这个后缀的前缀。因此,为了判断"p in S?"这个问题,我们将S所有的后缀提取出来,与p进行比对。为了加快比对的效率,我们把所有的后缀建成一棵树。

举个例子

  比如字符串aboreabo,它的后缀按长度依次为

  • o
  • bo
  • abo
  • eabo
  • reabo
  • oreabo
  • boreabo
  • aboreabo

  将它们按字典序排序

  • abo
  • aboreabo
  • bo
  • boreabo
  • eabo
  • o
  • oreabo
  • reabo

  则这棵树如下

  

  好吧,这棵树怪怪的。换了例子吧。对于字符串abcadabf,它的后缀树如下

  

  额。。。这棵树也怪怪的,看起来很像苏联的工业和农业。。。

  不管了继续说吧。

接着说原理

  上面我们,那么如果p in S1,p in S2,那么p是S1和S2的子串。因此,对于多个字符串S1,S2,……,Sn,建立一颗包含它们全部后缀的后缀树,那么重合的节点就是他们的公共子串了。

再举个例子

  我们举个例子吧。对于{abcde,cdef,ccde},首先对abcde建立后缀树,如下

  然后把cdef的所有后缀加进去,得到下面的树

  最后把ccde的所有后缀加进去,

  这是,我们可以看到,cde就是{abcde,cdef,ccde}的最长公共子串了。

  作业真多,写到这里。

  

广义后缀树(GST)算法的简介的更多相关文章

  1. 字典树(trie树) 后缀树 广义后缀树

    转自:http://www.cnblogs.com/dong008259/archive/2011/11/11/2244900.html (1)字典树(Trie树) Trie是个简单但实用的数据结构, ...

  2. 关于广义后缀树(多串SAM)的总结

    之前我们给的SAM的例题,基本上是一个串建SAM的就能做的 如果要建多个串的SAM应该怎么做呢 首先看题,bzoj2780 我一开始的想法是SA以前的弄法,把串拼起来,中间加分隔符做SAM 这题确实可 ...

  3. Suffix Tree(后缀树)

    这篇简单的谈谈后缀树原理及实现. 如前缀树原理一般,后缀trie树是将字符串的每个后缀使用trie树的算法来构造.例如banana的所有后缀: 0: banana 1: anana 2: nana 3 ...

  4. [算法]从Trie树(字典树)谈到后缀树

    我是好文章的搬运工,原文来自博客园,博主July_,地址:http://www.cnblogs.com/v-July-v/archive/2011/10/22/2316412.html 从Trie树( ...

  5. 笔试算法题(40):后缀数组 & 后缀树(Suffix Array & Suffix Tree)

    议题:后缀数组(Suffix Array) 分析: 后缀树和后缀数组都是处理字符串的有效工具,前者较为常见,但后者更容易编程实现,空间耗用更少:后缀数组可用于解决最长公共子串问题,多模式匹配问题,最长 ...

  6. 后缀树的建立-Ukkonen算法

    参考: Ukkonen算法讲解 Ukkonen算法动画 Ukkonen算法,以字符串abcabxabcd为例,先介绍一下运算过程,最后讨论一些我自己的理解. 需要维护以下三个变量: 当前扫描位置# 三 ...

  7. 【XSY1551】往事 广义后缀数组 线段树合并

    题目大意 给你一颗trie树,令\(s_i\)为点\(i\)到根的路径上的字符组成的字符串.求\(max_{u\neq v}(LCP(s_u,s_v)+LCS(s_u,s_v))\) \(LCP=\) ...

  8. 【codeforces666E】Forensic Examination 广义后缀自动机+树上倍增+线段树合并

    题目描述 给出 $S$ 串和 $m$ 个 $T_i$ 串,$q$ 次询问,每次询问给出 $l$ .$r$ .$x$ .$y$ ,求 $S_{x...y}$ 在 $T_l,T_{l+1},...,T_r ...

  9. 后缀树的线性在线构建-Ukkonen算法

    Ukkonen算法是一个非常直观的算法,其思想精妙之处在于不断加字符的过程中,用字符串上的一段区间来表示一条边,并且自动扩展,在需要的时候把边分裂.使用这个算法的好处在于它非常好写,代码很短,并且它是 ...

随机推荐

  1. Tcl与Design Compiler (九)——综合后的形式验证

    本文属于原创手打(有参考文献),如果有错,欢迎留言更正:此外,转载请标明出处 http://www.cnblogs.com/IClearner/  ,作者:IC_learner 这里来讲一下forma ...

  2. iOS最好用的引导页

    最近项目结束的时候又要改引导页,之前写的启动页改起来太麻烦了,所以就直接封装一个,功能可能还不是很完善,但是感觉用起来也比较方便,在这里和大家分享一下. 这是github的下载地址:https://g ...

  3. OOP的完美点缀—AOP之SpringAOP实现原理

    OOP的完美点缀-AOP之SpringAOP实现原理 前言 OOP与AOP OOP(Object Oriented Programming,面向对象编程),通过封装.继承将程序抽象为各个层次的对象,进 ...

  4. 性能调优之访问日志IO性能优化

    性能调优之访问日志IO性能优化   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:908821 ...

  5. web service 组件

    web service 组件 基本的 web service 平台是 XML + HTTP.所有标准的 web service 使用以下组件: SOAP(简单对象访问协议) UDDI(通用描述.发现与 ...

  6. BZOJ1857 传送带 (三分法求单峰函数极值)

    第一次发BZOJ的题解,先从水题开始吧,好不容易找到一道水题,那就从这题开始吧. 1.题设部分{ 题目描述: 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段.两条传送带分别为线段AB和线 ...

  7. C++ fstream 详解

    最近在写哈夫曼压缩,遇到了一个比较让人头疼的问题,那就是对文件的读写操作,尤其是以二进制的形式来读写,无奈C++Primer第五版上写的并不详细,很多让人困惑的地方没有涉及或者没有讲清楚.于是这几天我 ...

  8. c中的可重入和不可重入函数

    可重入和不可重入 的基本概念 ---简介--- 可重入函数主要用于多任务环境中,一个可重入的函数简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,转入OS调度下去执行另外一段 ...

  9. Spring Boot 整合 Redis 实现缓存操作

    摘要: 原创出处 www.bysocket.com 「泥瓦匠BYSocket 」欢迎转载,保留摘要,谢谢!   『 产品没有价值,开发团队再优秀也无济于事 – <启示录> 』   本文提纲 ...

  10. sublime text 3 打造舒适黑色主题

    效果: 这里我使用了两个主题插件组合成的 Spacegray Afterglow Ctrl+Shift+P -> Package Control:Install Packages 分别输入Spa ...