0.数据结构总结对比【更新中】

一、原子数据结构

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结构图

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值