逻辑结构 (数据之间的抽象关系) + 存储结构(这些关系在计算机内存中的具体实现方式) = 数据结构
一、逻辑结构(完整分类)
注:集合结构有时单独列出,有时归入非线性结构。
| 类别 | 子类型 | 典型例子 |
|---|---|---|
| 线性结构 | 一般线性表 | 顺序表、链表 |
| 受限线性表 | 栈、队列 | |
| 推广线性表 | 串(字符线性表) | |
| 非线性结构 | 树形结构 | 二叉树、二叉搜索树、堆、B树 |
| 图形结构 | 有向图、无向图 | |
| 集合结构 | 哈希表(逻辑上可视为集合)、并查集 |
-
集合:数据元素间无特定关系(属于同一集合)。
-
线性结构:一对一关系(如线性表、栈、队列)。
-
树形结构:一对多关系(如树、堆)。
-
图形结构:多对多关系(如有向图、无向图)。
二、存储结构(计算机中的实现方式)
主要有四种基本方式(可组合使用):
| 存储结构 | 核心特点 | 对应的逻辑结构示例 |
|---|---|---|
| 顺序存储 | 用连续内存单元存储,逻辑相邻→物理相邻 | 线性结构(数组、栈、队列)、完全二叉树(堆) |
| 链式存储 | 用附加指针连接结点,不要求物理连续 | 线性表(链表)、树(二叉链表)、图(邻接表) |
| 索引存储 | 建立索引表,通过索引项访问数据 | 线性结构(索引顺序表)、树(B+树等) |
| 哈希存储 | 通过哈希函数直接计算存储地址 | 集合、线性结构(哈希表) |
"逻辑上相邻,物理上不一定相邻"
-
顺序存储:逻辑相邻 → 物理相邻
-
链式存储:逻辑相邻 → 物理不一定相邻(靠指针)
"存储密度"对比
-
顺序存储:存储密度 ≈ 1(几乎没有额外开销)
-
链式存储:存储密度 < 1(每个节点多一个/多个指针
三、逻辑结构与存储结构的完整对应表
| 逻辑结构 | 常用存储结构(组合) |
|---|---|
| 线性表 | 顺序存储(顺序表) 链式存储(单/双/循环链表) 索引存储(索引顺序表) |
| 栈 | 顺序存储(顺序栈) 链式存储(链栈) |
| 队列 | 顺序存储(循环队列) 链式存储(链队列) |
| 串 | 顺序存储(定长/堆分配) 链式存储(块链) |
| 树 / 二叉树 | 顺序存储(完全二叉树/堆) 链式存储(二叉/三叉链表) 索引存储(B/B+树) |
| 图 | 顺序存储(邻接矩阵) 链式存储(邻接表、十字链表) 索引/散列(边集数组+索引) |
| 集合(哈希表) | 散列存储 + 顺序/链式(处理冲突) |
四、逻辑结构的"操作特性"与存储结构的"实现约束"
不能只看对应关系,还要看约束:
| 逻辑结构 | 隐含的操作特性 | 存储结构带来的限制 |
|---|---|---|
| 栈 | 后进先出(LIFO) | 顺序栈有最大容量限制;链栈无容量上限但需要额外指针空间 |
| 队列 | 先进先出(FIFO) | 顺序队列容易"假溢出",所以常用循环队列;链队列则无此问题 |
| 树(二叉树) | 父子关系、层次遍历 | 顺序存储只适合完全二叉树,普通二叉树会浪费大量空间 |
| 图 | 任意顶点间可达 | 邻接矩阵适合稠密图,邻接表适合稀疏图 |
关键点:逻辑结构定义"能做什么",存储结构决定"做得好不好"(时间/空间代价)。
五、不同存储结构的对比
| 存储结构 | 优点 | 缺点 |
|---|---|---|
| 顺序存储 | 随机访问快(O(1))、空间利用率高(无指针开销) | 插入/删除慢(需移动元素)、需预先分配连续空间 |
| 链式存储 | 插入/删除快(O(1) 已知位置)、动态扩展 | 随机访问慢(O(n))、额外指针占用空间 |
| 索引存储 | 查找较快、支持范围查询 | 维护索引有额外开销、索引本身也占空间 |
| 散列存储 | 查找极快(O(1) 平均) | 不支持顺序遍历、存在冲突问题、空间利用率不稳定 |
复杂度对比(同一逻辑结构,不同存储结构)
| 逻辑结构 | 存储结构 | 访问第i个 | 插入/删除(已知位置) | 查找(按值) | 空间占用 |
|---|---|---|---|---|---|
| 线性表 | 顺序表 | O(1) | O(n) | O(n) | 较省 |
| 线性表 | 链表 | O(n) | O(1) | O(n) | 额外指针 |
| 栈 | 顺序栈 | O(1)(仅栈顶) | O(1) | --- | 固定容量 |
| 栈 | 链栈 | O(1)(仅栈顶) | O(1) | --- | 动态扩展 |
| 队列 | 循环队列 | O(1)(仅队首/队尾) | O(1) | --- | 可能假溢出 |
| 队列 | 链队列 | O(1)(仅队首/队尾) | O(1) | --- | 无假溢出 |
六、容易被忽略的"混合存储结构"
实际中很多数据结构是混合使用多种存储方式的:
| 数据结构 | 实际存储方式 | 混合成分 |
|---|---|---|
| 哈希表(拉链法) | 散列存储 + 链式存储 | 数组(顺序)+ 链表(链式) |
| B+树 | 索引存储 + 顺序存储 | 多级索引 + 叶子节点顺序链表 |
| 邻接表(图) | 顺序存储 + 链式存储 | 顶点数组(顺序)+ 边链表(链式) |
| 跳表 | 链式存储 + 索引存储 | 多级链表 + 前进指针(类似索引) |
结论:不要认为一个数据结构只用一种存储方式,组合往往更强大。