1、线性数据结构
1.1、数组(Array)
1.2、链表(Linked List)
单链表
双向链表
循环链表
1.3、栈
1.4、队列
普通队列
循环队列
双端队列
2、非线性数据结构
2.1、树
2.1.1、普通树
特点:一个节点可以有任意多个子节点
算法重点:
DFS:Depth First Search(深度优先搜索)。树的先序遍历,是DFS的一种实现。
BFS:Breadth First Search(广度优先搜索)。就是 层序遍历。
2.1.1.1、B+ 树
数据库使用这个B+树。一种多路平衡搜索树(多个子节点,树的高度始终保持很低 不会退化成链表,节点里的 key 有序)。优点是磁盘IO少,有 双向链表 范围查询快
B+ 树的定义:
- 一个节点可以有多个子节点
- 子节点个数 = 阶(order)
- 比如:3 阶、4 阶、100 阶......
- 所有数据都存放在 叶子节点
- 叶子节点之间 用链表相连(双向链表)
mysql中,一般只有2到4层。
数据存储:B 树,内部 + 叶子。B+ 树,只在叶子
| 类型 | 叶子节点存储 | 数据顺序 | 查询效率特点 |
|---|---|---|---|
| 聚簇索引 | 整行数据 | 与索引顺序一致 | 范围查询快,唯一聚簇 |
| 二级索引 | 索引列 + 主键 | 与索引顺序不一致 | 单点查找快,但回表有开销 |
聚簇索引一般是主键。物理顺序只能有一个 ,所以 只能一个聚簇索引
2.1.2、二叉树
2.1.2.1、平衡二叉树
定义:
- 任意节点左右子树的高度差 ≤ 1
2.1.2.2、二叉搜索树
定义:
- 左子树所有节点值 < 根节点
- 右子树所有节点值 > 根节点
2.1.2.3、完全二叉树
定义:
- 除最后一层外,其余层都是满的
- 最后一层节点 从左到右连续排列
2.1.2.4、红黑树
红黑树是一种自平衡二叉搜索树,但它不是"高度严格平衡"的
1、每个节点非红即黑
2、根节点是黑色
3 、叶子节点(NIL,空节点)是黑色
4、 红色节点不能连续(红节点的子节点必须是黑)
5、 从任意节点到其所有后代 NIL 节点的黑节点数相同(黑高一致)
2.1.2.5、堆
1、结构性(Structure Property)
- 必须是 完全二叉树
- 最后一层从左到右依次填充
2、 堆序性(Heap Property)
- 每个节点都满足:
- 大顶堆:
parent ≥ children - 小顶堆:
parent ≤ children
- 大顶堆:
2.2、图
图 = 顶点(Vertex) + 边(Edge)
- 顶点(V):点、节点
- 边(E):连接顶点的关系
表示为顶点集边集。顶点集不能为空,边集可以为空。
分类:
无向图,有向图
无权图,带权图
3、散列结构
3.1、哈希表
哈希表是一种通过哈希函数将 Key 映射到数组下标,从而实现快速存取的数据结构。
key → hashCode → index。再把value和key,一起绑定到index。
在 Java JDK 8+ 的 HashMap 中:
| 参数 | 默认值 |
|---|---|
| 初始容量 | 16 |
| 负载因子 | 0.75,大于12时,才扩容 |
| 链表 → 树 | 8,大于8时,才变红黑树,还要容量不小于64 |
| 树 → 链表 | 6,小于6时,才变链表 |
| 树化最小容量 | 64,容量不小于64,链表才会开始变树 |
扩容规则就是:容量 × 2(翻倍)
HashMap 扩容时会根据新容量重新确定每个元素的存放位置;