Skip to content

什么是数据结构

  1. 数据结构就是把数据元素按照一定的关系组织起来的一组集合,用来组织和存储数据。
  2. 可以理解成 Java 中的 List,Map 等等
  3. 存储数据的方式(List,Map,数组,链表)
  4. 任何数据结构都是物理结构上的顺序结构和链式结构

数据结构的分类

逻辑结构

思想上的结构 : 厨房,卧室,卫生间

  • 线型结构(链表结构
    1. 线型结构中的数据元素存在一对一的关系。
  • 集合结构(数组结构
    1. 集合结构中数据元素除了属于同一个集合以外,没有其他的任何关系。
  • 树形结构(Tree 结构
    1. 树形结构中的数据元素存在一对多的层级关系
  • 图型结构(多对多结构
  • 多对多的数据元素

物理结构

真实的结构: 钢筋混凝土+牛顿力学

  • 顺序结构(紧密结构)(数组,特点查询快,增删慢)
  • 顺序结构存储的数据单元是连续的
  • 顺序存储结构的弊端,就像生活中排队也会有人插队也会有人有特殊情况离开,这时候整个结构都处于变化中,此时就需要链式结构去存储
  • 链式结构(跳转结构)(链表,特点增删快,查询慢)
  • 把数据元素存放在任意存储单元里,这组存储单元可以是连续的也可以是不连续的。此时数据之间不能反应元素之间的逻辑关系,因此在链表中会在每个元素的前后加上指针,来存放数据元素的地址。

链表结构(树)

AVL

在 AVL 中, 任何节点的两个子树的高度差最大为 1,所以也叫高度平衡树(这个树的层级会很深)

特性

  • 对于任何一个子树的 ROOT 节点,左边的数据一定同比右边的数据要小,反而亦之。
  • 任何节点的两个子树的高度差最大为 1 数据失衡的处理方式

数据失衡指的是在二叉树中,原本的树结构被打破了。需要重新调整树结构

左旋、右旋。人话版本: (如果根节点被打破了,在老的树形结构中在右边,需要上升到根节点的 Root,这个过程叫右旋)

RBT(红黑树)

和 AVL 很像,数据失衡的处理多了一个变色

B+树

B +树是一种多叉树结构,它的数据结构一般为多个页组成的多层级结构,一般一个页大小为 16 KB, 一个数据页可以放特别多的索引信息,所以扇出很高,每一个索引页都能指向一千多个子页,三层左右就可以存储大概 2 kw 的数据。最多只需要 3 次 IO。

时间复杂度: O (log 2 n)

以主键索引为例,最末级的叶子结点存放行数据。非叶子节点则放的是索引信息(主键 ID 和页号),用于加速查询

以新增数据为例,分为三种情况,

  1. 新插入的数据不会导致叶子节点和索引节点的变化,这个时候直接进行插入操作
  2. 新插入的数据会导致叶子节点变化而索引节点吧

调整数据页,叶子节点和非叶子节点都会调整。 叶子和索引节点都没满: 直接加进去 叶子节点满了,索引节点没满: 插入新数据时,调整叶子节点的数据页,往索引节点新增一条数据 叶子节点满了,索引节点满了:插入新数据时,叶子和索引节点的数据都要进行拆分。同时还需要往上层在加入一个新的索引。

B+树的数据页

数据页的结构:

  • 页层级信息
  • 页的元数据 (页头)
    • 前页指针
    • 页号
    • 后页指针
  • 页的行数据
    • 行 ID
    • 数据值
  • 页目录
    • 可以通过二分查找的方式,针对当前数据页进行查找。
  • 页尾
    • 校验码

索引是怎么建立的? 基于上述描述的数据页,每一个数据页里拿一个 ID 最小的数据(只拿 ID),并且记录下这个数据页的页号。组成一个新的数据页。 在这个新的数据页中,加入页层级的信息。这个就是索引

跳表

本质上是一个 链表 + 多级索引 + 指针 的一个组合,其目的是为了降低链表的循环查找。通过多级索引的方式来间隔出与原始链表的数据差距,通过指针指向原始链表。 通过牺牲空间来获取时间。

相关参考

红黑树(图解+秒懂+史上最全) - 疯狂创客圈 - 博客园

跳表 - OI Wiki

跳表(SkipList)原理篇 - Laymen - 博客园

waitingresult.com