`
kmplayer
  • 浏览: 509181 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

后缀树(Suffix Tree)

阅读更多
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)的最长公共部分.
分享到:
评论

相关推荐

    SuffixTree后缀树讲义

    例如,在某些后缀树的实现中,可能会用到稀疏后缀树(sparse suffix tree)或者后缀数组(suffix array)和后缀链接(suffix link)的组合,这样可以在处理非常大的数据集时优化空间复杂度。 后缀树不仅在理论上...

    后缀树算法 suffix_tree

    后缀树算法是一种高效处理字符串相关问题的数据结构,它的全称是“通用后缀树”(Universal Suffix Tree)。在计算机科学中,特别是在文本搜索、生物信息学和数据压缩等领域,后缀树有着广泛的应用。 后缀树的核心...

    SuffixTree 后缀树 c#实现

    后缀树(Suffix Tree)是一种高效的数据结构,用于处理字符串搜索和模式匹配问题。它在计算机科学中,尤其是在文本处理、生物信息学和数据压缩等领域有着广泛的应用。C#实现后缀树可以帮助开发者快速地在大量文本...

    suffix tree—后缀树的典型应用

    - 构建包含所有字符串的广义后缀树(Generalized Suffix Tree)。 - 遍历树的每个节点,统计经过该节点的不同字符串数量。如果有两个或更多的字符串通过了该节点,则表示找到了一个公共子串。 - 通过比较这些公共...

    suffix tree

    后缀树(Suffix Tree)是一种高效的数据结构,用于处理字符串查询和模式匹配问题。它在文本索引、生物信息学、自然语言处理等领域有广泛应用。后缀树的主要优点是能够快速地查找一个字符串的所有后缀,同时也能进行...

    后缀树线性时间实现--c++

    后缀树线性时间构建,Ukkoen算法 Suffix tree creation

    SuffixTree_java.zip_javascript

    总的来说,这个“SuffixTree_java.zip_javascript”资源提供了一个Java实现的后缀树数据结构,可以帮助开发人员在处理字符串搜索和模式匹配问题时提升性能。通过深入理解后缀树的工作原理,并结合提供的Java代码,...

    IT面试--后缀树详解及其代码实现

    tree = SuffixTree() tree.build(text) return tree ``` 通过以上介绍,可以看出后缀树是一种非常强大的工具,它不仅可以帮助我们在IT面试中解决问题,还能应用于实际项目中提高程序的效率。理解并掌握后缀树的...

    suffix tree.zip

    【标题】"suffix tree.zip"所包含的内容是关于广义后缀树(Generalized Suffix Tree,简称GST)的一种C++实现代码。广义后缀树是一种数据结构,主要用于高效地处理字符串集合中的模式匹配问题,它能快速查找并处理多...

    后缀树生成方式源码

    压缩包中的"SuffixTree"文件可能包含了这个简化版后缀树生成的源代码,初学者可以通过阅读和理解这段代码,快速掌握后缀树的基本构建原理和方法。在实际应用中,理解后缀树的工作机制和构建过程是非常重要的,这有助...

    后缀树的实现代码(国外一牛人写的,有注释)

    通过深入研究"suffixtree.cpp"和"suffixtree.h"中的代码,你将能够掌握后缀树的工作原理,并有能力将其应用于实际项目中,提高文本处理的效率和精度。对于任何对计算机科学,特别是算法和数据结构感兴趣的开发者来说...

    后缀树构建算法UKK_vs2008cpp实现

    在"SuffixTree"文件中,你应该能找到一个名为"UKK_vs2008cpp"的源文件,这个文件实现了上述的UKK算法。代码可能包括了节点定义、悬挂路径处理、边的插入和更新等核心函数。通过阅读和理解这段代码,你可以更深入地...

    后缀树 构建算法

    `SuffixTree.java`文件很可能包含了后缀树的类定义,包括节点结构、边的表示以及构建和查询的方法。节点可能包含指向其子节点的指针,以及与之相关的字符串片段。边可能存储了从一个节点到另一个节点的字符信息,...

    java后缀树代码

    3. **SUFFIX_TREE.java**: 可能是后缀树的辅助类或者接口,提供了额外的辅助方法,例如用于验证树的构造是否正确,或者提供优化操作。 4. **MyInteger.java**和**MyChar.java**: 这两个文件可能定义了自定义的整数...

    【suffixtree】2020年全国大学生软件测试大赛预选赛开发者测试题目下载

    2020年全国大学生软件测试大赛预选赛...本题使用的源码来自github开源代码,包含后缀树算法“suffixtree”相关的一系列数据结构和算法的实现,在安装mooctest插件的eclipse中可以查看自己的行覆盖和分支覆盖以及成绩。

    suffix-tree:后缀树的实现

    > ghci suffixTree.hs λ graph . SuffixTree.construct $ "cacao" (或您想要的任何其他字符串而不是“ cacao ”) 依赖关系 ( brew install graphviz ) ( cabal install graphviz ) ( cabal install zora ) ...

Global site tag (gtag.js) - Google Analytics