随笔分类 - 数据结构
摘要:对于一株树,如果我们需要在一株n个结点组成的树上做树上DP,但是其中仅有m个结点需要特殊处理。显然我们可以在原树上做一次完整的树上DP,其时间复杂度为O(n)。但是有的时候m远小于n,且这种请求可能不止发生一次,那么我们将无法在给定时间内完成任务。 实际上每次DP真正涉及到的结点数并不多,其仅为m个
阅读全文
摘要:对于文本T,设T’是T的逆序文本,若T'与T相同,那么称T为回文。比如aba、abba都是回文。 回文树是用于组织和统计文本T中所有回文的数据结构,可以优雅地解决大量回文有关的问题。如同AC自动机,后缀自动机等处理文本的数据结构一样,回文树的建立也拥有着线性的时间复杂度,并且其建立过程是在线的。 下
阅读全文
摘要:概述 后缀自动机是一类确定性有限自动机,其可以以O(n)的时空复杂度在长度为n的模式串P上进行编译,得到的则是Suffix Automaton,即后缀自动机。后缀自动机可以在O(m)的时间复杂度内判别长度为m的串是否是P的子串,是否是P的后缀。 理论部分 后缀自动机实际上是一副有向图,我们从起点st
阅读全文
摘要:概述 AC自动机全称Aho-Corasick automaton,该算法在1975年产生于贝尔实验室,是著名的多模匹配算法。 考虑这样一个场景,给出L个模式字符串(加总长度为N),以及长度为M大文本,要求从大文本中提取每个模式字符串出现的位置。如果使用KMP算法,时间复杂度将达到O(LM+N),而使
阅读全文
摘要:概述 LCT树是一类动态树,其用于动态维护多个连通无环图之间的关系,允许动态删除边或者增加边(新增的边不允许构成环)。在我眼中,LCT是类似线段树和Splay树的万金油数据结构,非常强悍,值得一学。LCT的所有操作的摊还时间复杂度均为O(log2(n)),其甚至优于更加简单的树链剖分。 算法说明 假
阅读全文
摘要:问题是这样的:对于一株树(无向无环连通图),为每个结点分配对应的权重。要求能高效计算任意两个结点之间的路径的各类信息,其中包括路径长度(路径上所有结点的权重加总),路径中最大权重,最小权重等等。到这里一切都还是比较简单的,我们可以利用Tarjan的LCA算法在线性时间复杂度内快速求解。但是如果还要求
阅读全文
摘要:简述 Splay树是一种二叉查找平衡树,其又名伸展树,缘由是对其进行任意操作,树的内部结构都会发生类似伸张的动作,换言之,其读和写操作都会修改树的结构。Splay树拥有和其它二叉查找平衡树一致的读写时间复杂度O(log2(n))。Splay树的优点是实现简单(苦于红黑树的小伙伴有福了),并且功能异常
阅读全文
摘要:今天学习了一下后缀数组,感觉是一个较为复杂且精细的数据结构,要理解它最好只抓一些关键的部分。 首先后缀数组是建立在一个字符串上的数据结构,其存储的元素是字符串的所有后缀,譬如'abc'的后缀有'c','bc','abc',其起始下标分别为2,1,0。要存储所有的后缀显然需要花费O(n^2)级别的空间
阅读全文