常用数据结构功能及复杂度总结
Posted ccz181078
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了常用数据结构功能及复杂度总结相关的知识,希望对你有一定的参考价值。
不定长数组
维护一个序列
在末尾插入/删除均摊O(1)
任意位置插入O(n)
指定位置查询/修改O(1)
空间O(n)
链表
维护一个序列
定位到第i个位置O(n)
在任意位置(已定位到该位置)插入/删除/修改O(1)
空间O(n)
散列表
维护键-值对应关系或维护键的存在性
1.开放寻址法散列表
若已插入键个数小于表大小的3/4则可以认为查询/修改/插入期望O(1),最坏O(n)若正确选择hash函数一般不会出现
删除只能标记删除
一般所需空间应大于最大键个数的4/3以保证效率
2.链散列法散列表
若表中键个数a,表大小n,则查询/修改/插入/删除期望O(1+a/n),最坏O(n)若正确选择hash函数一般不会出现
必要时可以用平衡树代替链表而做到最坏O(logn)但实用价值不大
并查集
维护一些元素以及两两之间是否同类(同类关系可传递)并支持将两个元素所属的类合为一类
1.并查集的森林实现
按秩合并+路径压缩 查询/合并 均摊O(α(n))
仅按秩合并 单次操作保证O(logn)
仅路径压缩 单次操作保证O(logn)
2.并查集的链表实现
查询/合并 均摊O(logn)
支持遍历某元素所在集合
树状数组
维护一个序列
设序列长度n,操作个数m
修改指定位置元素的值O(logn)
求指定区间元素的和O(logn)
推广:
通过维护差分可以O(logn)区间增加指定值,查询元素的值
维护任意满足区间加法的运算下的前缀和
维护任意满足区间间法的运算下的区间和
k维推广:
空间O(nk),利用散列表动态开点可做到O(mlogkn)
单次修改/k维区间和O(logkn)
平衡树
维护一个单调序列
查询前趋后继/插入/删除O(logn)
在维护size后可支持O(logn)查询排名/小于k的元素个数
不维护序列单调性而只维护普通序列 可以支持O(logn)指定位置插入/删除/查询
splay可实现区间翻转但所有操作复杂度为均摊
利用线段树的规则可以维护区间信息
线段树
维护一个序列的区间信息
可支持单点/区间 修改/查询,一般单次操作O(logn),要求维护的信息满足区间加法
推广:
利用类似平衡树的规则可以实现在指定位置插入/删除O(logn)
堆
维护一些无序元素
查询最小值/插入元素/删除最小值O(logn)
(已定位到指定元素)增加/减小指定元素的值O(logn)(斐波那契堆为均摊O(1))
可并堆可支持O(logn)合并
ST表
维护一个序列
构建时间空间均为O(nlogn)
查询区间最大值O(1)
最大值可换为其它任意 可由两个区间的值得出并区间的值 的运算
块状链表
维护一个序列
指定位置查询/修改/插入/删除/ 区间翻转/区间查询/区间修改 O(n0.5)
k-d树
维护k维空间中的点 k>1
构建O(knlogn)
空间O(n)
插入O(logn)
查询/修改(每维指定区间)信息O(n0.5)
查询最近/最远点O(n0.5)
可持久化数据结构
原数据结构有严格的时空复杂度,则可持久化后仍可保证复杂度
若原数据结构为线性数据结构则复杂度会乘上一个logn
一般空间不可避免的会增大每次操作logn或更大,但不会超过时间复杂度
均摊复杂度在可持久化后一般最坏情况会退化
数据结构树上推广
通过树链剖分可将形态不变的树分解为链进行维护,复杂度为原数据结构乘logn
对形态不变的树若信息符合区间减法则可以用dfs序维护,复杂度同原数据结构
link-cut tree可以支持树形态的简单修改操作,一般复杂度为均摊O(logn)
点分治/边分治也可用数据结构维护
以上是关于常用数据结构功能及复杂度总结的主要内容,如果未能解决你的问题,请参考以下文章