常用数据结构的功能及复杂度总结(OI)
不定长数组
维护一个序列
在末尾插入/删除均摊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)但实用价值不大
栈
维护一些元素
支持O(1)插入和弹出元素,且保证弹出的元素是栈中最后一个插入的元素
队列
维护一些元素
支持O(1)插入和弹出元素,且保证弹出的元素是队列中最先插入的元素
并查集
维护一些元素以及两两之间是否同类(同类关系可传递)并支持将两个元素所属的类合为一类
1.并查集的森林实现
按秩合并+路径压缩 查询/合并 均摊O(α(n,m))
仅按秩合并 单次操作保证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),treap可以在期望O(logn)做到这些操作
红黑树具有较小的期望常数,avl树则只在查询时较快
利用线段树的规则可以维护区间信息
线段树
维护一个序列的区间信息
可支持单点/区间 修改/查询,一般单次操作O(logn),要求维护的信息满足结合律
对长度为d的区间内每个点一起进行修改,复杂度为O(d+logn)
合并两棵线段树的复杂度与合并中减少的节点数相当,按某个值分裂线段树的复杂度为O(logn)
如果无修改操作,也可以O(nlogn)预处理,O(1)查询区间信息
利用类似平衡树的规则可以实现在指定位置插入/删除O(logn)
指针实现的线段树可以方便地可持久化/动态开点等
堆
维护一些无序元素
查询最小值O(1)
插入元素/删除最小值O(logn)
(已定位到指定元素)减小指定元素的值O(logn)(斐波那契堆等为均摊O(1))
可并堆可支持O(logn)合并
字典树
维护一些串
支持O(n)插入/删除一个长度为n的串,查询一个串是否存在,查询一个串是否是某个串的前缀
也可以用于实现字典操作维护键-值对应
通常实现需要空间O(nk),k为字符集大小,n为插入的总串长
平衡树维护可只用O(n)空间但操作复杂度变为O(nlogk)
ST表
维护一个序列
构建时间空间均为O(nlogn)
查询区间最大值O(1)
最大值可换为其它任意 可由两个区间的值得出并区间的值 的运算
块状链表/块状数组
维护一个序列,相当于动态分块
指定位置查询/修改/插入/删除/区间翻转/区间查询/区间修改 O(n0.5)
分块
可以维护很多线段树和平衡树等无法高效实现的操作,时间复杂度一般是O(n0.5),必要时可为了平衡块内和块间操作的复杂度而调整这个值
利用每个块内部元素较少和总块数较少的特点,可以用较高的复杂度预处理/重构一个块的信息,要求对每个块查询的结果可以高效合并,对每个块可以整体标记修改
k-d树
维护k维空间中的点 k>1
构建O(knlogn)
空间O(nk)
插入期望O(logn),如果用替罪羊树的重构规则可以保证最坏O(log2n)
查询/修改(每维指定区间)信息O(min(n,k2kn1-1/k))
查询最近/最远点/与向量最大点积/距离给定点小于定值的点期望复杂度较优,但最坏情况退化为O(n)
可持久化数据结构
一般实现方式为path copy或fat node
原数据结构有严格的时空复杂度,则可持久化后仍可保证复杂度
若原数据结构为线性数据结构则一般不能直接可持久化,复杂度可能虚要乘上一个logn
一般空间不可避免的会增大每次操作logn或更大,但不会超过时间复杂度
均摊复杂度在可持久化后一般最坏情况会退化
数据结构树上推广
通过树链剖分可将形态不变的树分解为链进行维护,复杂度为原数据结构乘logn
对形态不变的树若信息符合区间减法则可以用dfs序维护子树信息,或用树上差分维护路径信息,复杂度同原数据结构
link-cut tree可以支持树形态的简单修改操作,并可以进行链修改或询问,一般复杂度为均摊O(logn),经过一些修改可以在同样复杂度内维护子树信息
点分治/边分治也可用数据结构维护
嵌套数据结构
在必要时,可以把一种数据结构看做另一种数据结构维护的信息,从而将两个数据结构进行嵌套
例如k维树状数组可看做树状数组套k-1维树状数组,不同的数据结构也可以互相嵌套,例如线段树套平衡树实现查询区间<x的个数
由于具体嵌套方式的不同,复杂度通常是原复杂度相加或相乘,但也有例外
常用数据结构的功能及复杂度总结(OI)的更多相关文章
- 常用数据结构及复杂度 array、LinkedList、List、Stack、Queue、Dictionary、SortedDictionary、HashSet、SortedSet
原文地址:http://www.cnblogs.com/gaochundong/p/data_structures_and_asymptotic_analysis.html 常用数据结构的时间复杂度 ...
- C++常用数据结构的实现
常用数据结构与算法的实现.整理与总结 我将我所有数据结构的实现放在了github中:Data-Structures-Implemented-By-Me 常用数据结构与算法的实现.整理与总结 KMP字符 ...
- python常用数据结构讲解
一:序列 在数学上,序列是被排成一排的对象,而在python中,序列是最基本的数据结构.它的主要特征为拥有索引,每个索引的元素是可迭代对象.都可以进行索引,切片,加,乘,检查成员等操作.在py ...
- JAVA常用数据结构及原理分析
JAVA常用数据结构及原理分析 http://www.2cto.com/kf/201506/412305.html 前不久面试官让我说一下怎么理解java数据结构框架,之前也看过部分源码,balaba ...
- php常用数据结构
# 常用数据结构--------------------------------------------------------------------------------## 树(Tree)- ...
- Redis常用数据结构
Redis常用数据结构包括字符串(strings),列表(lists),哈希(hashes),集合(sets),有序集合(sorted sets). redis的key最大不能超过512M,可通过re ...
- Java 常用数据结构对象的实现原理 集合类 List Set Map 哪些线程安全 (美团面试题目)
Java中的集合包括三大类,它们是Set.List和Map, 它们都处于java.util包中,Set.List和Map都是接口,它们有各自的实现类. List.Set都继承自Collection接口 ...
- (6)Java数据结构-- 转:JAVA常用数据结构及原理分析
JAVA常用数据结构及原理分析 http://www.2cto.com/kf/201506/412305.html 前不久面试官让我说一下怎么理解java数据结构框架,之前也看过部分源码,balab ...
- 常用数据结构及算法C#/Java实现
常用数据结构及算法C#实现 1.冒泡排序.选择排序.插入排序(三种简单非递归排序) ,, , , , , , , , , }; //冒泡排序 int length = waitSort.Length; ...
随机推荐
- 【查看内存】Linux查看内存使用情况(二)
Linux查看CPU和内存使用情况:http://www.cnblogs.com/xd502djj/archive/2011/03/01/1968041.html 在做Linux系统优化的时候,物理内 ...
- Redis哨兵(sentinel)
介绍 Redis的sentinel主要是用来管理多个Redis服务器,sentinel负责(1)监控主服务器和从服务器的运行状态(2)主服务器运行故障时自动切换其中一台从服务器为主服务器 Sentin ...
- ggplot2作图详解7(完):主题(theme)设置
凡是和数据无关的图形设置内容理论上都可以归为主题类,但考虑到一些内容(如坐标轴)的特殊性,可以允许例外的情况.主题的设置相当繁琐,很容易就占用了 大量的作图时间,应尽量把这些东西简化,把注意力主要放在 ...
- Postman模拟高并发执行
一次,执行1000次. 看看服务器能否承受住. 查看每一次的执行情况,查看总的执行情况.成功情况,失败情况.
- Nginx 正则匹配
目录 Nginx 正则表达式之匹配操作符 过期缓存 针对浏览器 针对文件类型 针对文件夹 判断文件,文件夹 设置某些类型文件的浏览器缓存时间 匹配到所有uri 全局变量 常用正则 Nginx 正则表达 ...
- 计算机网络七层协议模型 “开放系统互联参考模型”,即著名的OSI/RM模型(Open System Interconnection/Reference Model)
计算机网络七层协议模型 作者:Ryan 时间:2013年10月7日 一.物理层(Physical Layer) OSI模型的最低层或第一层,规定了激活.维持.关闭通信端点之间的机械特性.电气特性 ...
- 一些自己常用的cdn
1.vue <script src="http://cdn.bootcss.com/vue/1.0.28-csp/vue.js"></script> < ...
- UVA-1660 Cable TV Network (最小割)
题目大意:给一张n个点.m条边的无向图,求最小点割集的基数. 题目分析:求无向图最小点割集的基数可以变成求最小割.考虑单源s单汇t的无向图,如果要求一个最小点集,使得去掉这个点集后图不再连通(连通分量 ...
- UVA-307 Sticks (DFS+剪枝)
题目大意:用n根长度未必相等的木棒匹配出最多数量的等长木棒. 题目分析:枚举所有可能的等长木棒的长度,通过DFS的方式逐根匹配,在此过程中要剪枝.先将木棒长度按从大到小排序,也就是说匹配每一根等长木棒 ...
- [转载]SQL语句练习
.查询“生物”课程比“物理”课程成绩高的所有学生的学号: 思路: 获取所有有生物课程的人(学号,成绩) - 临时表 获取所有有物理课程的人(学号,成绩) - 临时表 根据[学号]连接两个临时表: 学号 ...