一、原子数据结构
1、Hash
最常见数据结构之一,时间复杂度O(1)
优点:高性能、简单
缺点:缺点是不能查询相邻的元素
2、数组
数组是最常用的数据结构,分为一维数组、多维数组,时间复杂度O(n)
优点:简单、在数据量不大的情况下性能比较高
缺点:数组在扩容开销比较大,只能使用连续内存
3、链表
单向链表、双向链表、循环链表,时间复杂度O(n)。
优点:链表在扩容开销相对数组比较小,可以使用碎片内存
缺点:数组在扩容开销比较大,只能使用连续内存
4、跳跃表
跳跃表(SkipList)是一种能高效实现插入、删除、查找的内存数据结构,这些操作的期望复杂度都是O(logN)。跳跃表广泛使用于KV数据库中,诸如Redis、LevelDB、HBase都把跳跃表作为一种维护有序数据集合的基础数据结构。
众所周知,链表这种数据结构的查询复杂度为O(N),这里N是链表中元素的个数。在已经找到要删除元素的情况下,再执行链表的删除操作其实非常高效,只需把待删除元素前一个元素的next指针指向待删除元素的后一个元素即可,复杂度为O(1),但问题是,链表的查询复杂度太高,因为链表在查询的时候,需要逐个元素地查找。如果链表在查找的时候,能够避免依次查找元素,那么查找复杂度将降低。而跳跃表就是利用这一思想,在链表之上额外存储了一些节点的索引信息,达到避免依次查找元素的目的,从而将查询复杂度优化为O(logN)。将查询复杂度优化之后,自然也优化了插入和删除的复杂度。
优点: 与红黑树以及其他的二分查找树相比,跳跃表的优势在于实现简单,而且在并发场景下加锁粒度更小,从而可以实现更高的并发性
缺点:稳定性差,算法时间复杂度可能O(logN)~O(n)之间
5、树类
5.1、二叉树
二叉树是一切树的基础,常用于学习。二叉树时间复杂度O(logN)~O(N)
优点:结构简单
缺点:稳定性差,算法时间复杂度可能O(logN)~O(n)之间
5.2、红黑树
结构稳定型二叉树,时间复杂度稳定,树做增、删、改、查时间复杂度为O(logn)。场景:高效且要求稳定的算法场景,java HashMap、TreeMap,C++ 的 STL 中,map 和 set 是用红黑树实现的,epoll 在内核中的实现,用红黑树管理事件块,nginx 中,用红黑树管理 timer
优点:结构稳定
缺点:树结构实现复杂
5.3、Trie树
分词场景且树平衡高的情况下查询效率比较高,利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较。时间复杂度:O(1)~O(n),场景:elasticsearch存储结构
优点:分词检索场景性能好
缺点:算法不稳定,树算法上不够稳定,最坏情况下是O(n)
5.4、B树
树结构稳定,树时间复杂度稳定,增删改查时间复杂度为O(logmN)[备注:m是btree阶作为底数,N是数据量],数结构合适磁盘系统文件检索的特点。场景:mysql mysam引擎索引数据结构。
优点:磁盘友好型算法
缺点:xxx
5.5、B+树
树结构稳定,树时间复杂度稳定,增删改查时间复杂度为O(logmN)[备注:m是btree阶作为底数,N是数据量],数结构合适磁盘系统文件检索的特点。场景:mysql InnoDB引擎索引数据结构。
优点:磁盘友好型算法,相对Btree其末端子节点有data数据节点,通过data节点查询前后左右数据。
缺点:xxx
5.6、R树
R树是B树 向多维空间发展的另一种形式,它将对象空间按范围划分,每个结点都对应一个区域和一个磁盘页,非叶结点的磁盘页中存储其所有子结点的区域范围,非叶结点的 所有子结点的区域都落在它的区域范围之内;叶结点的磁盘页中存储其区域范围之内的所有空间对象的外接矩形。R树是一种动态索引结构。增删改查时间复杂度为O(logmN)[备注:m是btree阶作为底数,N是数据量]。
优点:适合经纬度查询
缺点:xxx
5.8、Treap树
二、非原子数据结构
1、LSM树
不是严格的树,目的是通过树的子节点串联一块块硬盘达到顺序写的能力。时间复杂度:O(logn)。场景:适合大数据计算框架 Hbase、clinkhouse。
LSM树的定义:
- LSM树是一个横跨内存和磁盘的,包含多颗"子树"的一个森林。
- LSM树分为Level 0、Level 1、Level 2 ... Level n 多颗子树,其中只有Level 0在内存中,其余Level 1-n在磁盘中。
- 内存中的Level 0子树一般采用排序树(红黑树/AVL树)、跳表或者TreeMap等这类有序的数据结构,方便后续顺序写磁盘。
- 磁盘中的Level 1-n子树,本质是数据排好序后顺序写到磁盘上的文件,只是叫做树而已。每一层的子树都有一个阈值大小,达到阈值后会进行合并,合并结果写入下一层。只有内存中数据允许原地更新,磁盘上数据的变更只允许追加写,不做原地更新。
LSM结构图: