常用数据结构功能及复杂度总结

不定长数组

维护一个序列

在末尾插入/删除均摊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)

点分治/边分治也可用数据结构维护

时间: 2025-01-07 10:45:25

常用数据结构功能及复杂度总结的相关文章

【转】常用数据结构及复杂度

常用数据结构及复杂度 常用数据结构的时间复杂度 Data Structure Add Find Delete GetByIndex Array (T[]) O(n) O(n) O(n) O(1) Linked list (LinkedList<T>) O(1) O(n) O(n) O(n) Resizable array list (List<T>) O(1) O(n) O(n) O(1) Stack (Stack<T>) O(1) - O(1) - Queue (Qu

常用数据结构及复杂度

常用数据结构的时间复杂度 Data Structure Add Find Delete GetByIndex Array (T[]) O(n) O(n) O(n) O(1) Linked list (LinkedList<T>) O(1) O(n) O(n) O(n) Resizable array list (List<T>) O(1) O(n) O(n) O(1) Stack (Stack<T>) O(1) - O(1) - Queue (Queue<T>

[ZZ]常用数据结构及复杂度

http://www.cnblogs.com/gaochundong/p/3813252.html 常用数据结构的时间复杂度 Data Structure Add Find Delete GetByIndex  Array (T[]) O(n) O(n) O(n) O(1)  Linked list (LinkedList<T>) O(1) O(n) O(n) O(n)  Resizable array list (List<T>) O(1) O(n) O(n) O(1)  Sta

常用数据结构[转]

原文:http://www.cnblogs.com/gaochundong/p/3813252.html 常用数据结构的时间复杂度 Data Structure Add Find Delete GetByIndex  Array (T[]) O(n) O(n) O(n) O(1)  Linked list (LinkedList<T>) O(1) O(n) O(n) O(n)  Resizable array list (List<T>) O(1) O(n) O(n) O(1)  

Lua 常用数据结构

Lua中的table不是一种简单的数据结构,它可以作为其它数据结构的基础.如数组.记录.线性表.队列和集合等,在Lua中都可以通过table来表示. 一.数组 在lua中通过整数下标访问表中的元素即可简单的实现数组.并且数组不必事先指定大小,大小可以随需要动态的增长. a = {} for i = 1,100 do a[i] = 0 end print("The length of array 'a' is " .. #a) squares = {1, 4, 9, 16, 25} pr

java 常用数据结构

本章介绍Java的实用工具类库java.util包.在这个包中,Java提供了一些实用的方法和数据结构.例如,Java提供日期(Data)类.日 历(Calendar)类来产生和获取日期及时间,提供随机数(Random)类产生各种类型的随机数,还提供了堆栈(Stack).向量 (Vector) .位集合(Bitset)以及哈希表(Hashtable)等类来表示相应的数据结构. 图1.1给出了java.util包的基本层次结构图.下面我们将具体介绍其中几个重要的类. ┌java.util.BitS

常用数据结构及算法C#实现

常用数据结构及算法C#实现 1.冒泡排序.选择排序.插入排序(三种简单非递归排序) 1 int[] waitSort = { 1,0, 12, 13, 14, 5, 6, 7, 8, 9, 10 }; 2 3 //冒泡排序 4 int length = waitSort.Length; 5 6 for (int i = 0; i < length; i++) 7 { 8 for (int j = i + 1; j < length; j++) 9 { 10 if (waitSort[j] &g

iOS 网易彩票-5设置模块三(常用小功能)

该篇文章中,用到很多iOS开发过程中常用的小功能,当前只是将这些功能集成到网易彩票的设置中.iOS-常用小功能介绍,请参考我的另一篇文章: iOS 常用小功能 总结:http://www.cnblogs.com/jys509/p/4805030.html 关于 效果图 思路分析: 使用self.tableView.tableHeaderView 自定义组头部,通过加载xib来实现 评分支持,使用[iOS 常用小功能 总结]中“应用评分”小功能 客户电话,使用[iOS 常用小功能 总结]中“打电话

CITRIX NETSCALER 常用的功能

概述 CITRIX NETSCALER常用的功能有:LB,CS,GSLB,SSL.LB实现的功能是服务器负载均衡,CS实现基于七层(域名,IP等)的负载均衡,GSLB实现的功能是全局负载均衡,SSL实现的功能是SSL加速. 配置步骤 系统配置 配置feature 如图: 进入system菜单,选择setting 点击 basic feature,选中一下feature,如图:选择需要的feature,不用的都关闭 点击advanced feature,选则需要的feature,不用的全部关闭 修