后缀树(Suffix tree)是一种数据结构,能快速解决很多关于字符串的问题。后缀树的概念最早由Weiner 于1973年提出,既而由McCreight 在1976年和Ukkonen在1992年和1995年加以改进完善。

后缀树提出的目的是用来支持有效的字符串匹配和查询。

一个具有m个词的字符串S的后缀树T,就是一个包含一个根节点的有向树,该树恰好带有m个叶子,这些叶子被赋予从1到m的标号。 每一个内部节点,除了根节点以外,都至少有两个子节点,而且每条边都用S的一个非空子串来标识。出自同一节点的任意两条边的标识不会以相同的词开始。后缀树的关键特征是:对于任何叶子i,从根节点到该叶子所经历的边的所有标识串联起来后恰好拼出S的从i位置开始的后缀,即S[i,…,m]。树中节点的标识被定义为从根到该节点的所有边的标识的串联。

图中示意了字符串 "I know you know I know "的后缀树。内部节点用圆来表示,叶子用矩形来表示,该例子中有六个叶子,被标号为1到6。 终止字符在图中被省略掉了。

同理, 若干字符串组成的后缀树, 称为一个扩展的后缀树:n个字符串Sn,其中字符串的长度为mn, 由这些字符串组成一个扩展的后缀树 T ,它是一个包含一个根节点的有向树,该树有mn个叶子,每个叶子都用一个两数字的坐标tuple(k,l)来标识,其中k的范围是从1到n,而l的范围是从1到mk ,每一个内部节点,除了根节点外,都有两个子节点并且每条边都用一个非空的S中若干单词构成的一个子串来标识。并且出自同一节点的任意两条边的标识的第一个单词不能相同。对于任意的叶子(i,j),从根节点到该叶子所经历的所有边的标识的串联恰好拼出后缀Si,该后缀从位置j开始,就是说它们拼出了Si[j..mi]。

用 Ukkonen 算法构造后缀树/后缀数组,O(n),用链表存放子节点(代码)

用倍增算法构造后缀数组,O(n log n)

后缀树与后缀数组

后缀数组(IOI国家集训队论文)

转载于:https://www.cnblogs.com/webtrados/archive/2010/06/06/1752833.html

后缀树和后缀数组的一些资料收集相关推荐

  1. 字符串相关处理kmp,前缀数,后缀树,后缀数组,最长回文串,最长重复字串,最长非重复字串

    1. 最长回文串 一般用后缀数组或者后缀树可以解决, 用此方法:http://blog.csdn.net/v_july_v/article/details/6897097 预处理后缀树,使得查询LCA ...

  2. 数据库应用-后缀树及后缀数组(Suffix-BäumeSuffix-Arraz)-2

    McCreight-Algorithmus 在O(n)时间内构造后缀树 基本思想 在ST中插入 suffi suff_i时,以下内容可以起到帮助作用: 1.v是ST中从根节点到叶节点i-1的一个内部节 ...

  3. 字符串-后缀树和后缀数组详解

    文章目录 后缀树 后缀数组 概念 sa[] rk[] height[] 例题 HDU-1403最长公共子串 洛谷P2408 不同子串个数 HDU-5769Substring 后缀树 建议先了解一下字典 ...

  4. 012-数据结构-树形结构-哈希树[hashtree]、字典树[trietree]、后缀树

    一.哈希树概述 1.1..其他树背景 二叉排序树,平衡二叉树,红黑树等二叉排序树.在大数据量时树高很深,我们不断向下找寻值时会比较很多次.二叉排序树自身是有顺序结构的,每个结点除最小结点和最大结点外都 ...

  5. O(n)线性构造后缀树详解(一)

    声明: 此为 Esko Ukkonen 论文翻译,由于本人才疏学浅,为了使用后缀树来进行DNA匹配,翻译此论文,完全是顺带之举,如有错误,请见谅!同时也是发现网上类似资料都不完整,顾发出翻译原版论文来 ...

  6. NOI数据结构:后缀树

    NOI数据结构:后缀树 后缀树_fanzitao的专栏-CSDN博客_后缀树 后缀树 - sangmado - 博客园 字符串-后缀树和后缀数组详解 字符串-后缀树和后缀数组详解_吴泽龙的博客-CSD ...

  7. 使用后缀自动机求后缀数组

    倒序建立后缀自动机的fail树就是后缀树,dfs后缀树得到后缀数组 #include <bits/stdc++.h> using namespace std;int last,dis[20 ...

  8. 【转】从Trie树(字典树)谈到后缀树

    本文第一部分,咱们就来了解这个Trie树,然后自然而然过渡到第二部分.后缀树,接着进入第三部分.详细阐述后缀树的构造方法-Ukkonen. 第一部分.Trie树 1.1.什么是Trie树 Trie树, ...

  9. 数据结构系列——Java后缀树实现代码

    上一篇文章介绍了什么是后缀树以及后缀树的应用场景,同时结合Ukkonen算法论文细述了如何在O(n)时间内构建一颗后缀树,这一篇详细介绍如何使用Java实现的Ukkonen后缀树构建算法.完整代码看这 ...

最新文章

  1. 利用双向循环链表实现长整数的存储_链表看这一篇真的就够了!
  2. linux 查看某一个进程的socket连接数
  3. Java Maven Profiles多环境一键部署
  4. java quartz timer_Java定时器Quartz和Timer
  5. [C# 基础知识系列]专题六:泛型基础篇——为什么引入泛型
  6. Python之异常处理-Exception
  7. Codeforces 741 D - Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths
  8. Comparable接口的使用:(知识回顾)
  9. C雨涵课后习题(18)
  10. 编程三角形面积公式_利用边长计算三角形面积 — 海伦公式推导
  11. 20210501:字符串与哈希表力扣专题学习记录
  12. flink源码分析_Flink源码分析之深度解读流式数据写入hive
  13. java终止程序语句总结 System.exit(1)、System.exit(0)、return;break;continue;
  14. 有东西,可以倚老卖老,可以倚少卖少
  15. maven+scala和java_maven打包scala+java工程
  16. UDS协议(车辆控制单元诊断系统开发架构及DID读取数据流程)
  17. 单点登录系统原理与接入
  18. 计算机桌面图标往左进去只能看见一半,win7系统桌面图标只显示一半另外一半显示别的程序的解决方法...
  19. 淘宝店铺老店标识怎么显示 怎么淘宝老店标识申请
  20. 有关Android Studio模拟机无法联网解决办法(傻瓜粗暴方法)

热门文章

  1. php注入类,简单实用的PHP防注入类实例
  2. shell一段脚本的一点经验(实时文件流读写)
  3. (转载)c++内存池实现 .
  4. Ethernet/IP 学习笔记四
  5. python导入pandas出错_构建d时如何解决python-pandas导入错误
  6. 安卓桌面精灵_小米MIUI安卓Q来啦,超多黑科技!凭啥红米先尝鲜?内附预览图...
  7. C语言中typedef的六种用法
  8. Linux 系统安全 - 近期发现的 polkit pkexec 本地提权漏洞(CVE-2021-4034)修复方案
  9. PyQt5 技巧篇-便于文字排版的等宽字体推荐:Source Code Pro的中文为英文两倍宽字体
  10. PyQt5 技术篇 - Qt Designer怎么用styleSheet设置按钮的背景