要理解suffix tree就首先要理解Trie
还好我在刚进雅虎的时候接触到了Double Array Trie的一个具体实现
对Trie有着比较深刻的了解。
Trie的优势就是他能在o(n)时间内搜索一个长度为n的字符串s是否在字典里。
关于Trie的资料,有下面几个链接可以参考
http://www.allisons.org/ll/AlgDS/Tree/Trie/
http://linux.thai.net/~thep/datrie/datrie.html
言归正传,简单点说,后缀树就是将一个给定字符串的所有后缀全部压入一个Trie
然后将只有单个叶子的节点压缩,从而形成的一棵树
关于后缀树如何构造,有很多资料进行介绍,就不多说了
例如:
http://www.allisons.org/ll/AlgDS/Tree/Suffix/
上面这个网页里有一个手动构造后缀树的例子,非常生动
我更关注的是后缀树的用途,总结起来大概有如下几种
1. 查找字符串o是否在字符串S中。
方案:用S构造后缀树,按在trie中搜索字串的方法搜索o即可。
原理:若o在S中,则o必然是S的某个后缀的前缀。
听起来有点拗口,举个例子。例如S: leconte,查找o: con是否在S中
则o(con)必然是S(leconte)的后缀之一conte的前缀
有了这个前提,采用trie搜索的方法就不难理解了。
2. 指定字符串T在字符串S中的重复次数。
方案:用S+’$'构造后缀树,搜索T节点下的叶节点数目即为重复次数
原理:如果T在S中重复了两次,则S应有两个后缀以T为前缀,重复次数就自然统计出来了。
3. 字符串S中的最长重复子串
方案:原理同2,具体做法就是找到最深的非叶节点。
这个深是指从root所经历过的字符个数,最深非叶节点所经历的字符串起来就是最长重复子串。
为什么要非叶节点呢?因为既然是要重复,当然叶节点个数要>=2。
4. 两个字符串S1,S2的最长公共部分
方案:将S1#S2$作为字符串压入后缀树,找到最深的非叶节点,且该节点的叶节点既有#也有$(无#)。
大体原理同3
上段文字可能表达不够准确,更准确的表达可以参考
http://www.allisons.org/ll/AlgDS/Tree/Suffix/
http://blog.csdn.net/g9yuayon/archive/2008/06/21/2574781.aspx
当然英文wiki和google也是很好的参考资料~
分享到:
相关推荐
后缀树,又称PAT树或Trie...通过学习和理解后缀树的原理和构建方法,我们可以解决许多实际问题,并提升算法设计和实现的能力。如果你想要进一步了解后缀树,可以通过阅读提供的"后缀树入门.ppt"文件获取更详细的信息。
首先,我们需要理解后缀树的基本概念。一个后缀树包含一个或多个字符串的所有后缀,包括空字符串。在构建后缀树时,通常会在每个字符串末尾添加一个特殊的结束标记,例如"$",以区分不同的后缀。例如,字符串"banana...
- **Crusher.ppt**:可能是关于后缀树在数据压缩方面应用的演示文稿,讲解如何利用后缀树进行有效的数据压缩。 - **20021121-suffix_tree.ppt**:可能是某个讲座或课程的资料,介绍2002年时后缀树算法的最新进展或...
压缩包中的"SuffixTree"文件可能包含了这个简化版后缀树生成的源代码,初学者可以通过阅读和理解这段代码,快速掌握后缀树的基本构建原理和方法。在实际应用中,理解后缀树的工作机制和构建过程是非常重要的,这有助...
在理解后缀树之前,我们可以先了解一下Trie(字典树),它是一种用于快速查找字符串的数据结构。Trie中的每个节点都有若干条边,每条边对应一个字符。在Trie中查找字符串时,沿着字符串的字符顺序遍历对应的边,直到...
本文将详细解析"java后缀树代码"这个主题,结合提供的文件列表,我们将会深入理解后缀树的实现原理,并探讨如何在Java中构建这种数据结构。 后缀树的核心在于它可以存储一个字符串的所有后缀,并且每个后缀只用一条...
在深入理解后缀树的基础上,可以进一步探索更高级的变体,如后缀数组、Burrows-Wheeler变换等,这些都极大地扩展了字符串处理的能力。 总结,后缀树是一种强大的工具,它能够高效地处理和查找字符串,尤其适用于...
首先,我们要理解后缀树的基本概念。后缀树是由一个字符串的所有后缀构成的有向树。每个节点代表一个后缀,从根节点到某个节点的路径表示的是该后缀的前缀。例如,对于字符串"banana",其后缀有"banana"、"anana"、...
首先,我们需要理解后缀树的基本概念。后缀树是由一个字符串的所有后缀构成的有向树,其中每个节点代表一个子串,边上的标签对应于从根到该节点的路径上的字符。在树中,从任意节点出发沿着一条路径到达叶节点的路径...
后缀树是一种重要的数据结构,尤其在字符串处理和文本搜索领域有着广泛的应用。它能高效地存储和查询字符串的所有后缀,使得对于大量后缀的查找、比较和操作变得极其快速。Ukkonen算法是由Esa Ukkonen于1995年提出的...
后缀树的直观理解可以通过Trie树来辅助。Trie是一种字符串检索树,每条边代表一个字符,从根节点开始沿着字符串的字符顺序遍历,如果能到达叶子节点,说明该字符串存在于Trie中。在Trie的基础上,通过合并只有一条子...
这篇博客文章可能是关于如何实现后缀树的Java源代码。 后缀树的基本思想是将所有字符串的后缀连接成一个单一的长字符串,然后构建一棵树,每个节点代表字符串的一部分,边则表示子串的延续。这棵树的关键特性是,...
### IT面试——后缀树详解及其代码实现 #### 1. 后缀树的基本概念 后缀树(Suffix Tree)是一种高效的数据结构,用于解决多种...理解并掌握后缀树的原理及其实现方法,对于从事编程工作的开发者来说是非常有益的。
首先,我们需要理解后缀树的基本构造。假设我们有一个字符串S,它的所有后缀构成了后缀树的节点。在树中,每个内部节点表示的是字符串的公共前缀,而叶子节点则对应于字符串的完整后缀。从根节点到任意一个叶子节点...
### 后缀树Skew算法详解 #### 一、引言 后缀树是一种非常高效的数据结构,用于处理字符串中的模式...通过对Skew算法的学习和理解,我们不仅可以更好地掌握后缀树的构建原理,还能在实际项目中灵活运用这一强大的工具。
学习和理解后缀树的实现,对于提升对字符串处理和数据结构的理解非常有帮助。你可以通过阅读"st.c"的源代码来深入理解后缀树的工作原理,包括节点的连接方式、如何找到字符串的公共前缀以及如何有效地进行模式匹配。...
最后,尽管Trie树和后缀树在处理字符串问题时表现出色,但它们也存在一些限制,比如在某些实现中可能会占用较多的内存空间,特别是在处理大型文本数据时。因此,在应用这些数据结构之前,程序员需要对问题进行充分的...
首先,我们需要理解后缀树的基本构造过程,一种常见的方法是Ukkonen算法。该算法通过动态规划逐步构建树,每次添加一个字符到字符串时,更新树的结构。在C#中,我们可以通过递归或者迭代的方式来实现这个算法。关键...