zoukankan      html  css  js  c++  java
  • 广义后缀树(GST)算法的简介

    一、导言

      最近软件安全课上,讲病毒特征码的提取时,老师讲了一下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}的最长公共子串了。

      作业真多,写到这里。

      

  • 相关阅读:
    PHP中利用jQuery操作json格式数据,实现$_POST的数据传输和接收
    如何快速掌握一门技术【婴儿最强学习回头看一看】
    显示桌面.scf
    注册表数据库
    win10home_fixgpedit.msc
    Eclipse 中 jetty 调试模式(debug)正常启动无法访问;非调试模式正常
    svn中的与资源库同步操作 讲解
    windows下二进制mysql的卸载以及安装教程
    mysql服务正在启动或停止中请稍后片刻再试一次,服务强制杀死的方法
    Eclipse中git检出、更新、提交、合并分支、以及解决冲突
  • 原文地址:https://www.cnblogs.com/super-zhang-828/p/5920636.html
Copyright © 2011-2022 走看看