后缀树的生成——如何做到简单快速(含源码)

         最近两个月一直在看JULY的“结构之法 算法之道”,链接:http://blog.csdn.net/v_JULY_v,收获颇多,在此感谢!其中一篇讲到后缀树的,http://blog.csdn.net/v_july_v/article/details/6897097,讲解了后缀树的结构特征、生成方法和一些用处,看了很久,但还是觉得其中的生成方式比较复杂,要具体实现的话,编码难度有点大,很多编程经验不是很好的都很难正确的编写出来。因此,我希望能得到一个编码难度小,且速度较快的生成方式。终于,在很多次研究各种字符串生成过程后,找到了一个很简单而且速度比较快的生成方式。现描述如下:

    step 1 :
    initialise:  扫描给定字符串的每一个字符,如果该字符和根节点的每一个儿子首字母都不同,则将以此字符为首的整个后缀插入到根节点的儿子中;

    step 2:

  scan_all_suffix:     
             然后从给定字符串的最长后缀到最短后缀依次按trie树的方式在初步建立的树中查找,肯定会出现以下3种情况之一:
             情况一:如果查找成功,则当前后缀处理完成,继续查找下一个后缀;
             情况二:如果对比完一个节点都符合,但在其子节点中找不到下一个分支,查找失败,则直接用当前后缀剩下的字符串建立新节点,并作为当前节点的一个子节点;
             情况三:否者,一定会在一个节点字符串的第 k 个字符处出现查找失败,假设此时已经查找到当前后缀的第m个字符处,这时就可以分割该节点:

1. 以当前查找节点从 k 开始的后缀建立新节点,并作为当前查找结点一个子节点;

2. 当前扫描的后缀从 m 开始的后缀建立新节点,作为其另一个子节点;

3.将当前节点从k开始的后缀去掉;

    当运行完上面两个循环后,一颗后缀树就建立完成了。

    现结合一个实例演示一下流程:

    建立字符串 aabac 的后缀树:

    根据上面的step1,就可以得到下面的树结构:

        initialise.jpg

                                                    

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值