码迷,mamicode.com
首页 > 编程语言 > 详细

广义后缀树(GST)算法的简介

时间:2016-09-29 20:16:37      阅读:454      评论:0      收藏:0      [点我收藏+]

标签:

导言

  最近软件安全课上,讲病毒特征码的提取时,老师讲了一下GST算法。

  这里就做个小总结。  

正文

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

  GST算法的提出是为了解决最大公共子串问题,也就是在多个字符串中,找到他们共有的子串。这个问题听起来和最大公共子序列问题(LCS)有些相似,但是二者有两个不同点:①一个是公共子串,一个是公共子序列,后者可以是不连续的;②GST算法可以对多个字符串求公共子串,而我们一般指的LCS算法只能对两个字符串求公共子序列。

  下面继续介绍GST。

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

  对于"p in S?"这个问题,假设S=rpq,也就是说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,它的后缀树如下

技术分享

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

  不管了继续说吧。

  对于多个字符串S1,S2,……,Sn,建立一颗包含它们全部后缀的后缀树。我们举个例子吧。对于{abcde,cdef,ccde},首先对abcde建立后缀树,如下

技术分享

  然后把cdef加进去,

技术分享

  最后把ccde加进去,

技术分享

先写到这,去吃饭了。

 

 

 

 

 

  

 

广义后缀树(GST)算法的简介

标签:

原文地址:http://www.cnblogs.com/super-zhang-828/p/5920636.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!