最近两个月一直在看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,就可以得到下面的树结构: