算法与数据结构八日谈之六——数据结构专题(uncompleted)

这是个大工程
我要慢慢写
朱军稍候
UPD:暂时更完了,代码部分再等会吧,估计很长。

1.最·基础数据结构

数组

别问我为什么把这放进来,我就是闲着没事做

可以在栈空间不够用时用手写栈来进行dfs。

队列

bfs所需的基础数据结构,在spfa时也会用到

链表

在插入操作较多时可以使用链表来维护
hash时可将重复元素以链表的形式挂在一张表上

2.基础数据结构

上面那些东西(除了链表)是毫无实现难度的,学过计算机语言的就会使用,下面这些则需要一点点的算法知识

树状数组

代码简洁,常数小。
可以维护单点修改和区间求和/极值
利用两个树状数组可以区间修改和单点求值
利用三个树状数组可以区间修改和区间求值(然而并没有什么卵用)
一般可以在两行解决问题

线段树

思路简单,编程复杂度小
可以维护区间和/极值。支持区间修改和单点修改

权值线段树

线段树的区间端点由原序列的下标变为值域
在数值与 n 同阶或可以离线操作的情况下各种操作的速度比大多数平衡树要快(跟vEB树差不多)
于是排名就是前缀和,其它的基本操作随便搞搞就可以了

zkw线段树

zkw神的线段树,由顶向下实现,(据说)速度奇快无比。具体的参见其论文《统计的力量》

(普通的)堆

堆可以动态维护集合里的极值。
支持将极值从集合中弹出,向集合中加入一个数,询问极值。
(普通的堆)插入和删除都是 O(lgn)
可以在 O(n) 的时间内建一个大小为n的堆
堆排序即利用堆按大小顺序依次取出每个元素,时间复杂度是 O(nlgn)

3.进阶数据结构

平衡树

平衡树维护可以判断元素大小关系的集合。

伸展树Splay

伸展树的核心操作是伸展(废话)
每次访问节点,则需要将其旋转到根的位置,这个操作被称为伸展
splay能称作平衡的核心是在伸展中的某种trick
当祖孙三代方向一致时,先转父亲,再转儿子,否则转儿子转两次。
由势能分析可以得到伸展树的均摊复杂度是 Θ(lgn) 的(别问我,我不知道咋分析)
伸展树最重要的操作是提取区间,这是它能在oi界中生存的最大的依仗(之一),每次将待提取的区间的左端点左边那个点伸展到根节点,再将区间右端点右边那个点伸展到根节点右儿子处,此时根节点右儿子的左儿子就是所求区间。
splay可以解决很多需要线段树解决的问题。
非常实用的数据结构,不学不算搞过oi

树堆Treap

可以证明(你™就是不会证瞎扯个啥),随机插入的二叉排序树的深度是 O

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值