来自 hhj 的数据结构总结
膜拜 hhj 大佬。
分块
对于分块的数据结构,往往是用来解决其它线性数据结构以及树形数据结构难以解决的问题,由此,分块也被冠以“终极数据结构”的称号。
1.块状数组
块状数组,即把一个数组分为几个块,块内信息整体保存,若查询时遇到两边不完整的块直接暴力查询,块的大小通常为
分块的难点因题而异,重要的是抓住分块对时间复杂度的宽容性。
例如,修改整个块的复杂度需要为
例题就直接用
2.块状链表
平衡树太难调了,什么人会在考场上调平衡树啊。
对于插入的操作,分块也可以解决部分。与块状数组类似,块状链表将原数组按照
块状链表在插入时可以
- 定期重构。可以在每进行
次插入操作后重构整个数组,时间复杂度在均摊意义下是不变的。 - 超限重构。在某个块大小超过
后重构整个数组,复杂度与上一种相同,常数更优。 - 超限分裂。在某个块大小超过
后分裂这个块,若使用链表维护每个大块之间关系,重构常数可以更小。
但是
当然如果正解并不是分块,想拿到高分就要好好考虑考虑代码的常数大小了。
例题
树状数组
恕我直言,树状数组能做的线段树全都能做。
所以树状数组相较于线段树而言,更优的就只有它优秀的时间复杂度了。树状数组的查询复杂度本质上是
树状数组的修改和查询有两种理解方式,一种是后缀修改+单点查询,一种是单点修改+前缀查询。两种理解方式的不同可能会导致运用思维的不同,甚至关系到能否解出题目。
例题
线段树
线段树在数据结构题中出现频率还是相当高的。毕竟平衡树太长,树状数组我们有时候又不当做数据结构题。
普通的线段树,单点修改区间修改,单点查询区间查询,支持的很多,主要难度还是体现在
所以这里还是讲其它的线段树的方法。
1.线段树合并
从根到叶,把同时存在的点合并,非同时存在时直接把这颗子树取走。
看到 “存在的点” 就知道线段树合并一般是在动态开点的权值线段树上打的。
例题
2.可持久化线段树
每次进行修改时维护新树的节点,将需要修改的点新建,并将原来的子树连上,就可以在不改动原树的情况下新维护一颗树。注意若是区间修改,不能直接
可持久化线段树的亮点除了可以查询历史版本以外,还在于部分在区间上和树上的性质。例如可以以数组下标为时间,用作差的方式维护区间信息,或者在树上维护路径信息。
例题
3.线段树套线段树
用线段树去维护树上信息是相当经典的线段树用法。维护的信息不太难时,可以直接树剖然后用普通的线段树;维护的信息较难但是可以离线查询时,可以尝试线段树合并或者可持久化线段树来维护子树信息或者路径信息。但是如果维护的信息较难而且需要在线时,或许可以试试看树套树。为什么不试试终极数据结构呢。
具体来说就是在每个线段树节点上开一颗线段树。当然,两颗线段树中往往至少有一颗是动态开点的权值线段树。这里有个小盲区,可能认为外层的线段树一定是是在序列上二分的,实际上外层使用值域上二分的权值线段树或许能够维护更多信息。你问我这和上面说的树上问题有什么关系?树上问题在树剖之后不久转成序列上问题了嘛。
注意线段树套线段树时一般不会有
例题
单调队列
单调队列维护队列性质的同时维护单调性。做法很简单,来看题目。
例题
例题
单调栈
几乎同上,不过维护的变成队列性质了。
和队列不同,单调栈是先进后出的,所以对于每一个塞进栈里的点,都应该在删除时或者仍旧存在于栈里的时候可以做出贡献,否则直接用单个变量维护最值即可。
例题
斜率优化
斜率优化可以优化
把
并查集
没有路径压缩和启发式合并的并查集操作是
普通的并查集若要支持单个元素的删除或移动操作,需要预先给每个节点制作副本,并将副本作为父亲,以保证自身永远是叶子。可以用动态开点线段树实现可持久化并查集。并查集不支持较低复杂度的集合分离。
并查集可以拿来跑最小生成树,没什么好讲的就不讲了。
扩展域并查集
扩展域并查集,实际上就是给并查集的点开多倍的技巧。使用时将
可以拿来跑二分图的判断,但是我们还可以做这题:
权值并查集
在对并查集进行路径压缩和合并操作时,这些权值具有一定属性,即可将他们与父节点的关系,变化为与所在树的根结点关系。
权值并查集是每个点带权的并查集,这个权值可以是所有儿子的元素和,也可以是该点与父亲的关系,或者是其他的什么。根据权值种类的不同,一个点的权值在合并,删除,移动甚至是路径压缩的时候改动。
例题
例题
倍增
倍增是一个大块,但是我觉得比起数据结构来说它更像是一种思想。
倍增地求,倍增的一维往往表示“走
相对于其它数据结构,倍增更重要的当然是倍增的思想,不同的题目的倍增维护的信息不同,思想也是不同的,这里给出更多的例题。
例题
例题
例题
ST表
ST 表是用于解决 可重复贡献问题 的数据结构。
区间最值与
ST表基于倍增的思想,对于一个静态的数组,ST表预处理出从
ST表的预处理如上是
ST表的优势完全在于它在可重复贡献问题上的快速查询。事实上,ST表也可以
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现