总结与归纳之数据结构
(开一个大坑)
前言
数据结构,顾名思义,是用来高效维护数据的工具,数据之间的内在联系只有在合适数据结构下才能得到高效的处理,作为
总论
总论数据结构,便是理解什么时候要用数据结构,也就是数据结构题的特征。
第一个:元素。也就是我们要维护的信息集合中的元素,对于序列、矩阵这一类的线性结构,元素是每一位的数字及其附带的各种信息。对于树、图这一类非线性结构,元素是点和边及其附带的各种信息。
第二个:元素的集合。也就是我们要维护的信息集合,对于序列、矩阵这一类的线性结构,元素的集合是区间。对于树、图这一类非线性结构,元素的集合是子树,树链,联通分量。
第三个:操作。当然这个不是数据结构题的必要特征,但是却频繁出现。一般来说有两类,修改和查询,两者是相提并论的,要思考的问题有:修改是怎么影响查询的?查询是否具有可合并性?查询需要维护哪些信息?修改是否会破坏某些性质?
第四个:操作的拓扑序。这是针对离线算法的,将操作的集合看成一个整体,我们考虑操作之间的继承关系、传递关系,按照某一种顺序对集合排序,然后根据继承关系和传递关系,优化复杂度。具体方式有两类,一个是按某一维度排序,另一个是按某种分治的结构处理。
数据结构题和别的题型一个很大的区别是:只关注如何高效维护信息,而不关注解决问题的决策。
正文
基础数据结构
栈
队列
链表
数据哈希(这也基础?)
并查集
传统+基础变种并查集
可持久化并查集
单调栈/队列
ST 表
树状数组
线段树
传统线段树
线段树的基本思路,就是把区间当作节点的二叉树,将操作区间沿树边分解,从而在树高的对数量级下高效完成区间上的问题。所以一般的线段树复杂度为
那么线段树适合什么样的题型呢?从区间信息上说:区间信息和查询结果可快速合并。例如区间和可看作左右两个子区间的区间和,区间加可看作左右两个子区间的区间加。从修改上说:修改标记可与区间信息和其他修改标记快速合并,但是如果不能在一定情况下我们有基于势能分析和期望概率分析(目前不会)下,可以保证复杂度的线段树暴力。
对于基于势能分析的区间维护,如果难以进行区间修改,但当整个区间满足某种特性时可快速剪枝,并且对于区间查询很容易,那么也可使用线段数。(但是由于这个部分目前学的不是很严谨,所以留个坑)
线段树的思考步骤如下:第一步:定义区间信息(我们要维护什么?)。第二步:定义标记(修改要留下哪些整体标记?)。第三步:定义标记的优先级(标记之间会相互影响,有一定次序)。第四步:定义区间加区间(
传统线段树的典型例子叫扫描线,是一种重要的思想,对于面积并问题和周长并问题都可以快速求解,基本思想就是假设有一条扫描线从左到右扫过,进入一个矩形扫过的边为入边,出去一个矩形扫过的边为出边,那么我们得到一个有标类型的边集,每经过一条边我们对扫描线在这条边上的权值加或减 1,区间加减操作,表示被矩形覆盖了几次,然后维护,区间被覆盖的长度,将整条扫描线被覆盖的长度乘上到下一条边的横向距离,就得到了这一段距离内所有矩形的面积并,每一段都这样处理和统计,即可得到区间并和类似的周长并。
李超线段树
李超线段树可以维护的问题是:给定
李超线段树的常见应用是斜率优化。具体的我们可能会得到一个式子,形如:
一种方法是用斜率优化,使求解的复杂度变为
segbeats
主席树
动态开点与标记永久化
线段树分裂与合并
线段树分治
平衡树
传统平衡树
可持久化平衡树
左偏树
传统左偏树
可持久化左偏树
k-d tree
树链剖分/dsu on tree
LCT
珂朵莉树
cdq 分治
整体二分
点/边分治/树
虚树
分块
莫队
普通莫队
带修莫队
树上莫队
回滚莫队
树套树(排列组合?)
总结
本文作者:2021hych
本文链接:https://www.cnblogs.com/2021hych/p/17319663.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步