1,后缀树(Suffix tree)是一种数据结构,能快速解决很多关于字符串的问题。后缀树提出的目的是用来支持有效的字符串匹配和查询。
简单点说,后缀树就是将一个给定字符串的所有后缀全部压入一个Trie,然后将只有单个叶子的节点压缩,从而形成的一棵树.
2,后缀树的用途,总结起来大概有如下几种
(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,后缀树的构造:O(n)
给定一个txt:`mississippi'
(1)得到txt的所有后缀:
T1 = mississippi = txt
T2 = ississippi
T3 = ssissippi
T4 = sissippi
T5 = issippi
T6 = ssippi
T7 = sippi
T8 = ippi
T9 = ppi
T10 = pi
T11 = i
T12 = (empty)
(2)将所有非空后缀进行排序,得到:
T11 = i
T8 = ippi
T5 = issippi
T2 = ississippi
T1 = mississippi
T10 = pi
T9 = ppi
T7 = sippi
T4 = sissippi
T6 = ssippi
T3 = ssissippi
(3)将所有后缀的公有前缀进行合并,即可得到:
tree substrings
tree-->|---mississippi m .. mississippi
|
|---i-->|---ssi-->|---ssippi i .. ississippi
| | |
| | |---ppi issip,issipp,issippi
| |
| |---ppi ip, ipp, ippi
|
|---s-->|---si-->|---ssippi s .. ssissippi
| | |
| | |---ppi ssip, ssipp, ssippi
| |
| |---i-->|---ssippi si .. sissippi
| |
| |---ppi sip, sipp, sippi
|
|---p-->|---pi p, pp, ppi
|
|---i p, pi
--- Suffix Tree for "mississippi" ---
4,应用
问题:
寻找字符串S的最长回文字符串.
注:所谓“回文”是指当一个字符串正序读和逆序读时都一样。即p=reverse(p)
分析:
等价于寻找S与reverse(S)的最长公共部分.
分享到:
相关推荐
例如,在某些后缀树的实现中,可能会用到稀疏后缀树(sparse suffix tree)或者后缀数组(suffix array)和后缀链接(suffix link)的组合,这样可以在处理非常大的数据集时优化空间复杂度。 后缀树不仅在理论上...
后缀树算法是一种高效处理字符串相关问题的数据结构,它的全称是“通用后缀树”(Universal Suffix Tree)。在计算机科学中,特别是在文本搜索、生物信息学和数据压缩等领域,后缀树有着广泛的应用。 后缀树的核心...
后缀树(Suffix Tree)是一种高效的数据结构,用于处理字符串搜索和模式匹配问题。它在计算机科学中,尤其是在文本处理、生物信息学和数据压缩等领域有着广泛的应用。C#实现后缀树可以帮助开发者快速地在大量文本...
- 构建包含所有字符串的广义后缀树(Generalized Suffix Tree)。 - 遍历树的每个节点,统计经过该节点的不同字符串数量。如果有两个或更多的字符串通过了该节点,则表示找到了一个公共子串。 - 通过比较这些公共...
后缀树(Suffix Tree)是一种高效的数据结构,用于处理字符串查询和模式匹配问题。它在文本索引、生物信息学、自然语言处理等领域有广泛应用。后缀树的主要优点是能够快速地查找一个字符串的所有后缀,同时也能进行...
后缀树线性时间构建,Ukkoen算法 Suffix tree creation
总的来说,这个“SuffixTree_java.zip_javascript”资源提供了一个Java实现的后缀树数据结构,可以帮助开发人员在处理字符串搜索和模式匹配问题时提升性能。通过深入理解后缀树的工作原理,并结合提供的Java代码,...
tree = SuffixTree() tree.build(text) return tree ``` 通过以上介绍,可以看出后缀树是一种非常强大的工具,它不仅可以帮助我们在IT面试中解决问题,还能应用于实际项目中提高程序的效率。理解并掌握后缀树的...
【标题】"suffix tree.zip"所包含的内容是关于广义后缀树(Generalized Suffix Tree,简称GST)的一种C++实现代码。广义后缀树是一种数据结构,主要用于高效地处理字符串集合中的模式匹配问题,它能快速查找并处理多...
压缩包中的"SuffixTree"文件可能包含了这个简化版后缀树生成的源代码,初学者可以通过阅读和理解这段代码,快速掌握后缀树的基本构建原理和方法。在实际应用中,理解后缀树的工作机制和构建过程是非常重要的,这有助...
通过深入研究"suffixtree.cpp"和"suffixtree.h"中的代码,你将能够掌握后缀树的工作原理,并有能力将其应用于实际项目中,提高文本处理的效率和精度。对于任何对计算机科学,特别是算法和数据结构感兴趣的开发者来说...
在"SuffixTree"文件中,你应该能找到一个名为"UKK_vs2008cpp"的源文件,这个文件实现了上述的UKK算法。代码可能包括了节点定义、悬挂路径处理、边的插入和更新等核心函数。通过阅读和理解这段代码,你可以更深入地...
`SuffixTree.java`文件很可能包含了后缀树的类定义,包括节点结构、边的表示以及构建和查询的方法。节点可能包含指向其子节点的指针,以及与之相关的字符串片段。边可能存储了从一个节点到另一个节点的字符信息,...
3. **SUFFIX_TREE.java**: 可能是后缀树的辅助类或者接口,提供了额外的辅助方法,例如用于验证树的构造是否正确,或者提供优化操作。 4. **MyInteger.java**和**MyChar.java**: 这两个文件可能定义了自定义的整数...
2020年全国大学生软件测试大赛预选赛...本题使用的源码来自github开源代码,包含后缀树算法“suffixtree”相关的一系列数据结构和算法的实现,在安装mooctest插件的eclipse中可以查看自己的行覆盖和分支覆盖以及成绩。
> ghci suffixTree.hs λ graph . SuffixTree.construct $ "cacao" (或您想要的任何其他字符串而不是“ cacao ”) 依赖关系 ( brew install graphviz ) ( cabal install graphviz ) ( cabal install zora ) ...