第一章:物理存储模型——连续与离散
绪论:数据结构的物理前提
- 数据结构通常从逻辑关系开始讨论,例如:线性结构、树结构、图结构
- 但无论逻辑关系如何设计,所有数据最终都必须落在 真实存储介质上(内存、磁盘) 。
- 因此,任何数据结构在实现层面都必须回答一个更基础的问题:数据在物理空间中如何排布?
- 在这一层,所有结构最终都可以归结为两种基本模型——连续存储与离散存储。数组与链表只是它们最直接的代表。
一、连续存储:数组
-
定义: 在内存中申请一段 连续地址空间,所有元素大小相同,按照固定顺序排列。
-
机制: 数组的定位依赖地址计算公式:
Address = Base + Index × Size -
查找复杂度:
O(1)地址可以直接计算,不需要遍历路径。
-
特点:
- 访问效率高
- 结构刚性: 连续空间必须保持完整,因此会产生以下成本:
- 容量不足时,需要重新申请更大的连续空间并整体搬迁数据
- 在中间插入或删除元素时,需要移动后续元素
-
总结: 访问效率极高,但修改成本集中。
二、离散存储:链表
-
定义: 节点可以分布在内存任意位置,通过 指针 建立逻辑顺序。
-
机制: 每个节点通常包含两部分:
- 数据
- 指向下一节点的地址
-
查找复杂度:
O(n)访问元素时必须从头节点开始遍历。
-
特点:
-
结构灵活: 插入或删除节点只需要修改指针(已知位置为
O(1)),不需要连续内存 -
访问效率受限
- 每个节点需要额外存储指针,空间利用率较低
- 节点分散,缓存命中率较低
-
-
总结: 结构灵活,局部修改成本低,但访问效率较低。
三、硬件现实的影响:连续性的优势
-
**现实问题:**理论复杂度通常只关注
O(1)与O(n)。 但在真实系统中,性能还受到 硬件结构 的影响。 -
硬件机制(CPU缓存) :现代 CPU 采用多级缓存(L1/L2/L3) 数据通常以 缓存行 为单位加载,常见大小为 64 字节。
-
性能影响:
- 连续存储的数据通常位于相邻地址,一个缓存行可以同时加载多个元素。
- 顺序访问时,缓存命中率更高。
- 链表节点分散在不同地址。
- 指针跳转往往触发新的缓存加载。 因此在真实系统中,这种差距往往 远大于理论复杂度中的常数差异。
-
工程选择:因此在工程实践中,高性能系统通常优先选择:
- 数组
- 数组改造型结构(如动态数组、块状结构)
纯链表很少作为核心数据结构。
-
结论:在现代硬件环境下,连续性通常比指针灵活性更具性能优势。 许多高性能结构,本质上都是在 扩展能力 与 局部连续性 之间寻找平衡。
本章结论
- 数据结构在物理层面只有两种基本模型:连续存储与离散存储。
- 连续结构访问效率高,但扩展成本集中;离散结构扩展灵活,但访问效率受限。
- 在现代硬件环境下,缓存局部性使连续存储通常具有更高性能。
- 许多高性能结构,本质上是在 连续性与扩展能力之间寻找平衡。
下一问题
- 本章讨论的是:数据如何存放。
- 当数据规模不断扩大时,更关键的问题变成:
如何在大量数据中 快速定位目标元素?
- 为了解决这一问题,需要建立新的 定位结构:索引结构