约束塑造数据结构(一):连续存储与离散存储——数组、链表与 CPU 缓存

3 阅读3分钟

第一章:物理存储模型——连续与离散

绪论:数据结构的物理前提

  • 数据结构通常从逻辑关系开始讨论,例如:线性结构、树结构、图结构
  • 但无论逻辑关系如何设计,所有数据最终都必须落在 真实存储介质上(内存、磁盘)
  • 因此,任何数据结构在实现层面都必须回答一个更基础的问题:数据在物理空间中如何排布?
  • 在这一层,所有结构最终都可以归结为两种基本模型——连续存储离散存储。数组与链表只是它们最直接的代表。

一、连续存储:数组

  • 定义: 在内存中申请一段 连续地址空间,所有元素大小相同,按照固定顺序排列。

  • 机制: 数组的定位依赖地址计算公式: Address = Base + Index × Size

  • 查找复杂度: O(1)

    地址可以直接计算,不需要遍历路径。

  • 特点:

    • 访问效率高
    • 结构刚性: 连续空间必须保持完整,因此会产生以下成本:
      1. 容量不足时,需要重新申请更大的连续空间并整体搬迁数据
      2. 在中间插入或删除元素时,需要移动后续元素
  • 总结: 访问效率极高,但修改成本集中。

二、离散存储:链表

  • 定义: 节点可以分布在内存任意位置,通过 指针 建立逻辑顺序。

  • 机制: 每个节点通常包含两部分:

    • 数据
    • 指向下一节点的地址
  • 查找复杂度: O(n)

    访问元素时必须从头节点开始遍历。

  • 特点:

    • 结构灵活: 插入或删除节点只需要修改指针(已知位置为 O(1)),不需要连续内存

    • 访问效率受限

      1. 每个节点需要额外存储指针,空间利用率较低
      2. 节点分散,缓存命中率较低
  • 总结: 结构灵活,局部修改成本低,但访问效率较低。

三、硬件现实的影响:连续性的优势

  • **现实问题:**理论复杂度通常只关注O(1)O(n)。 但在真实系统中,性能还受到 硬件结构 的影响。

  • 硬件机制(CPU缓存) :现代 CPU 采用多级缓存(L1/L2/L3) 数据通常以 缓存行 为单位加载,常见大小为 64 字节

  • 性能影响

    • 连续存储的数据通常位于相邻地址,一个缓存行可以同时加载多个元素。
    • 顺序访问时,缓存命中率更高。
    • 链表节点分散在不同地址。
    • 指针跳转往往触发新的缓存加载。 因此在真实系统中,这种差距往往 远大于理论复杂度中的常数差异
  • 工程选择:因此在工程实践中,高性能系统通常优先选择:

    • 数组
    • 数组改造型结构(如动态数组、块状结构)

    纯链表很少作为核心数据结构。

  • 结论:在现代硬件环境下,连续性通常比指针灵活性更具性能优势。 许多高性能结构,本质上都是在 扩展能力局部连续性 之间寻找平衡。

本章结论

  • 数据结构在物理层面只有两种基本模型:连续存储离散存储
  • 连续结构访问效率高,但扩展成本集中;离散结构扩展灵活,但访问效率受限。
  • 在现代硬件环境下,缓存局部性使连续存储通常具有更高性能。
  • 许多高性能结构,本质上是在 连续性与扩展能力之间寻找平衡

下一问题

  • 本章讨论的是:数据如何存放
  • 当数据规模不断扩大时,更关键的问题变成:

如何在大量数据中 快速定位目标元素

  • 为了解决这一问题,需要建立新的 定位结构:索引结构