这是个大工程
我要慢慢写
朱军稍候
UPD:暂时更完了,代码部分再等会吧,估计很长。
1.最·基础数据结构
数组
别问我为什么把这放进来,我就是闲着没事做
栈
可以在栈空间不够用时用手写栈来进行dfs。
队列
bfs所需的基础数据结构,在spfa时也会用到
链表
在插入操作较多时可以使用链表来维护
hash时可将重复元素以链表的形式挂在一张表上
2.基础数据结构
上面那些东西(除了链表)是毫无实现难度的,学过计算机语言的就会使用,下面这些则需要一点点的算法知识
树状数组
代码简洁,常数小。
可以维护单点修改和区间求和/极值
利用两个树状数组可以区间修改和单点求值
利用三个树状数组可以区间修改和区间求值(然而并没有什么卵用)
一般可以在两行解决问题
线段树
思路简单,编程复杂度小
可以维护区间和/极值。支持区间修改和单点修改
权值线段树
线段树的区间端点由原序列的下标变为值域
在数值与 n 同阶或可以离线操作的情况下各种操作的速度比大多数平衡树要快(跟vEB树差不多)
于是排名就是前缀和,其它的基本操作随便搞搞就可以了
zkw线段树
zkw神的线段树,由顶向下实现,(据说)速度奇快无比。具体的参见其论文《统计的力量》
(普通的)堆
堆可以动态维护集合里的极值。
支持将极值从集合中弹出,向集合中加入一个数,询问极值。
(普通的堆)插入和删除都是
可以在 O(n) 的时间内建一个大小为n的堆
堆排序即利用堆按大小顺序依次取出每个元素,时间复杂度是 O(nlgn)的
3.进阶数据结构
平衡树
平衡树维护可以判断元素大小关系的集合。
伸展树Splay
伸展树的核心操作是伸展(废话)
每次访问节点,则需要将其旋转到根的位置,这个操作被称为伸展
splay能称作平衡的核心是在伸展中的某种trick
当祖孙三代方向一致时,先转父亲,再转儿子,否则转儿子转两次。
由势能分析可以得到伸展树的均摊复杂度是 Θ(lgn) 的(别问我,我不知道咋分析)
伸展树最重要的操作是提取区间,这是它能在oi界中生存的最大的依仗(之一),每次将待提取的区间的左端点左边那个点伸展到根节点,再将区间右端点右边那个点伸展到根节点右儿子处,此时根节点右儿子的左儿子就是所求区间。
splay可以解决很多需要线段树解决的问题。
非常实用的数据结构,不学不算搞过oi
树堆Treap
可以证明(你™就是不会证瞎扯个啥),随机插入的二叉排序树的深度是 O