导言

  最近软件安全课上,讲病毒特征码的提取时,老师讲了一下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. RecyclerView中装饰者模式应用

    近段时间一直在加班,在赶一个项目,现在项目接近尾声,那么需要对过去一段时间工作内容进行复盘,总结下比较好的解决方案,积累一些经验,我认为的学习方式,是「理论-实践-总结-分享」,这一种很好的沉淀方式. ...

  2. Java实现缓存(LRU,FIFO)

    现在软件或者网页的并发量越来越大了,大量请求直接操作数据库会对数据库造成很大的压力,处理大量连接和请求就会需要很长时间,但是实际中百分之80的数据是很少更改的,这样就可以引入缓存来进行读取,减少数据库 ...

  3. 7.Redis常用命令:ZSet

    Sorted-Sets和Sets类型极为相似,它们都是字符串的集合,都不允许重复的成员出现在一个Set中.它们之间的主要差别是Sorted-Sets中的每一个成员都会有一个分数(score)与之关联, ...

  4. SQLite 数据库

    内容来源:高成珍.钟元生<Android编程经典案例解析> SQLite 数据库是Android 中内嵌的轻量级关系型数据库,本质上只是一个文件.SQLite 内部只支持NULL,INTE ...

  5. List去除重复的元素

         有两种方法,一种是去重不带顺序的,一种是去重带顺序的. /* * 方法1: 无顺序 * Hastset根据hashcode判断是否重复,数据不会重复 */ public static Lis ...

  6. firefox上安装selenium ide失败

    Selenium 初学者第一步: 最近在学习selenium,但是在安装的时候遇到了问题.我是直接在firefox安装的Selenium IDE ,虽然下载安装之后存在于扩展中,但是工具栏里并没有显示 ...

  7. GET 请求复制转发一直等待响应的问题 Transfer-Encoding: chunked

    今天在做Proxy 转发请求的时候发现 GET的请求转发时一直在等待输出. 而Post等其它操作是可以的. 同事告诉我一般一直等待响应可能是输出内容长度和头部ContentLength不一致导致的, ...

  8. setTimeout 和 setInteval 的区别。

    学习前端的可能都知道js有2个定时器setTimeOut和setinteval.用的时候可能不是很在意,但是2者还是有区别的 setTimeout方法是定时程序,也就是在什么时间以后干什么.干完就完了 ...

  9. 【Java并发】详解 AbstractQueuedSynchronizer

    前言 队列同步器 AbstractQueuedSynchronizer(以下简称 AQS),是用来构建锁或者其他同步组件的基础框架.它使用一个 int 成员变量来表示同步状态,通过 CAS 操作对同步 ...

  10. NOIP2015游记——一次开心又失望的旅行

    啊,一年一度的NOIP终于是结束了 以前的大神都有写自己的感受 然而我居然给忘了!!!! 吓得我赶紧来写一份游记 Day.-INF--出发前一个星期 机智的我选择了停课 就是为了OIER这伟大而又光荣 ...