标签:
最近软件安全课上,讲病毒特征码的提取时,老师讲了一下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,它的后缀按长度依次为
将它们按字典序排序
则这棵树如下
好吧,这棵树怪怪的。换了例子吧。对于字符串abcadabf,它的后缀树如下
额。。。这棵树也怪怪的,看起来很像苏联的工业。。。
不管了继续说吧。
对于多个字符串S1,S2,……,Sn,建立一颗包含它们全部后缀的后缀树。我们举个例子吧。对于{abcde,cdef,ccde},首先对abcde建立后缀树,如下
然后把cdef加进去,
最后把ccde加进去,
先写到这,去吃饭了。
标签:
原文地址:http://www.cnblogs.com/super-zhang-828/p/5920636.html