> For the complete documentation index, see [llms.txt](https://datastructure-1.gitbook.io/datastructure-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://datastructure-1.gitbook.io/datastructure-docs/fu-lu/appendix-a-quick-reference.md).

# 附录 A：数据结构选择速查

[<- 第 15 章　后缀树与后缀数组](/datastructure-docs/di-ba-bu-fen-gao-ji-zi-fu-chuan/15-suffix-tree-and-array.md) | [课程目录](/datastructure-docs/readme.md) | [附录 B：常见面试题与练习 ->](/datastructure-docs/fu-lu/appendix-b-exercises.md)

***

## 附录 A：数据结构选择速查与选型矩阵

在工程实践与系统架构设计中，不存在“银弹”式的数据结构。每种结构都是在**时间复杂度**、**空间复杂度**、**内存局部性（Cache-Friendliness）以及实现复杂度**之间所做的工程权衡（Trade-off）。

***

### 1. 全景操作复杂度速查表

下表汇集了本书涵盖的 18 种核心数据结构在基础操作下的渐进复杂度表现：

| 数据结构                   |   访问 (Access)  |       查找 (Search)       |    插入 (Insert)   |   删除 (Delete)  |       空间复杂度      |    缓存局部性    | 典型工业应用                           |
| ---------------------- | :------------: | :---------------------: | :--------------: | :------------: | :--------------: | :---------: | -------------------------------- |
| **静态数组**               |     $O(1)$     | $O(n)$ / $O(\log n)^\*$ |         -        |        -       |      $O(n)$      |   极高（连续内存）  | 基础定长缓冲区、查找表                      |
| **动态数组 (Vector)**      |     $O(1)$     |          $O(n)$         |     均摊 $O(1)$    |     $O(n)$     |      $O(n)$      |   极高（连续内存）  | C++ `std::vector`, Python `list` |
| **单/双向链表**             |     $O(n)$     |          $O(n)$         |     $O(1)^\*$    |    $O(1)^\*$   |      $O(n)$      |   极差（指针离散）  | LRU 淘汰链表、操作系统空闲块管理               |
| **循环队列 / 栈**           |     $O(1)$     |          $O(n)$         |      $O(1)$      |     $O(1)$     |      $O(n)$      |   高（数组实现）   | 函数调用栈、线程任务环形队列                   |
| **二叉搜索树 (BST)**        |     $O(h)$     |          $O(h)$         |      $O(h)$      |     $O(h)$     |      $O(n)$      |      较差     | 符号表初级原型                          |
| **AVL 树**              |   $O(\log n)$  |       $O(\log n)$       |    $O(\log n)$   |   $O(\log n)$  |      $O(n)$      |      较差     | 读密集型内存索引、Windows 内核内存管理          |
| **红黑树 (RBT)**          |   $O(\log n)$  |       $O(\log n)$       |    $O(\log n)$   |   $O(\log n)$  |      $O(n)$      |      较差     | C++ `std::map`, Linux CFS 调度器    |
| **伸展树 (Splay)**        | 均摊 $O(\log n)$ |      均摊 $O(\log n)$     |  均摊 $O(\log n)$  | 均摊 $O(\log n)$ |      $O(n)$      |      较差     | 局部性缓存、多层路由前缀缓存                   |
| **二叉堆 (Heap)**         |  $O(1)$ (Top)  |          $O(n)$         |    $O(\log n)$   |   $O(\log n)$  |      $O(n)$      |   极高（平铺数组）  | 定时器轮、Top-K 过滤、优先队列               |
| **左式堆 (Leftist Heap)** |  $O(1)$ (Top)  |          $O(n)$         |    $O(\log n)$   |   $O(\log n)$  |      $O(n)$      |      较差     | 优先队列快速高效合并（$O(\log n)$）          |
| **B 树**                | $O(\log\_m n)$ |      $O(\log\_m n)$     |  $O(\log\_m n)$  | $O(\log\_m n)$ |      $O(n)$      |  极高（节点内连续）  | 文件系统元数据、早前数据库索引                  |
| **B+ 树**               | $O(\log\_m n)$ |      $O(\log\_m n)$     |  $O(\log\_m n)$  | $O(\log\_m n)$ |      $O(n)$      |   极高（外存适配）  | MySQL InnoDB 索引、Linux XFS 文件系统   |
| **KD 树**               |        -       |  $O(\log n) \sim O(n)$  |    $O(\log n)$   |   $O(\log n)$  |      $O(n)$      |      中等     | 空间地理检索、KNN 最近邻检索、光线追踪            |
| **哈希表 (拉链法/开放寻址)**     |        -       |  平均 $O(1)$ / 最坏 $O(n)$  |     平均 $O(1)$    |    平均 $O(1)$   |      $O(n)$      | 开放寻址高 / 拉链差 | Redis 字典、编译器符号表、哈希索引             |
| **并查集 (路径压缩+按秩)**      |        -       |      $O(\alpha(n))$     |  $O(\alpha(n))$  |        -       |      $O(n)$      |  极高（双数组编码）  | Kruskal 算法、连通分量判定、网络拓扑           |
| **后缀树 (Ukkonen)**      |        -       |          $O(m)$         |    $O(n)$ 离线构建   |        -       |    $O(n \cdot    |    \Sigma   | )$                               |
| **后缀数组 + LCP**         |        -       |  $O(m \log n)$ / $O(m)$ | $O(n \log n)$ 构建 |        -       | $O(n)$ (仅几倍 $n$) | 高（线性连续整型数组） | 搜索引擎倒排初筛、全文本压缩索引                 |

> 注：$^\*$ 数组二分查找要求有序；链表 $O(1)$ 插入删除前提是已定位到目标节点指针；$\alpha(n)$ 为反阿克曼函数，在宇宙原子总数规模下不超过 4。

***

### 2. 场景化技术选型决策树

```
您的核心业务需求是什么？
│
├─► [1] 纯键值检索与映射
│     ├─► 极速点查，无范围遍历需求 ──────► 哈希表 (std::unordered_map / Redis Dict)
│     ├─► 需要有序遍历、范围查询 [L, R]
│     │     ├─► 数据常驻内存 ─────────────► 红黑树 (std::map) / 跳表 (SkipList)
│     │     └─► 海量数据存放在磁盘/外存 ──► B+ 树 (InnoDB 聚集索引)
│     └─► 访问具有极端局部性 (80% 访问集中在 5% 节点) ──► 伸展树 (Splay Tree)
│
├─► [2] 优先级调度与动态极值
│     ├─► 单一优先队列，无需合并 ─────────► 经典二叉堆 (std::priority_queue)
│     ├─► 频繁需要合并两个优先队列 ───────► 左式堆 / 斜堆 (Leftist / Skew Heap)
│     ├─► 动态流式数据求中位数 ───────────► 对顶堆 (大顶堆 + 小顶堆平衡)
│     └─► 滑动窗口内求最值 ───────────────► 单调队列 (Monotonic Queue)
│
├─► [3] 字符串与文本处理
│     ├─► 单次主串与模式串匹配 ───────────► KMP 算法 / Boyer-Moore 算法
│     ├─► 静态多模式串敏感词过滤 ─────────► AC 自动机 (Aho-Corasick)
│     ├─► 动态前缀检索 / 自动补全 ────────► 字典树 (Trie)
│     └─► 超长文本（如基因组）多次复杂子串查询
│           ├─► 内存充裕，要求理论极限 $O(m)$ ──► 后缀树 (Suffix Tree)
│           └─► 内存受限，追求工程极致 ───────► 后缀数组 + LCP (Suffix Array)
│
├─► [4] 多维空间与几何数据
│     ├─► 低维（$k \le 10$）空间点最近邻/范围检索 ──► KD 树 (KD-Tree)
│     ├─► 地理空间多边形、矩形碰撞重叠查询 ──────► R 树 (R-Tree)
│     └─► 极高维（$k > 100$）向量检索（大模型 Embedding） ──► HNSW / 局部敏感哈希 (LSH)
│
└─► [5] 连通性与拓扑关系
      ├─► 仅需维护动态等价类与连通性 ─────► 并查集 (Disjoint Set Union)
      ├─► 有向无环依赖判定与编译执行序 ───► 拓扑排序 (Kahn 算法 / DFS 染色)
      ├─► 单源非负权最短路径 ─────────────► Dijkstra 算法 (堆优化)
      └─► 网络工程关键工序排期 ───────────► AOE 网关键路径 (Earliest/Latest 状态机)
```

***

### 3. 内存布局与缓存命中特性对比

在现代微处理器架构中，访存延迟（L1 Cache \~1ns vs DRAM \~60ns）对系统实际吞吐量起决定性作用：

```
[连续内存布局] ─────── Cache 友好度: ★★★★★
  数组 / 动态数组 (Vector) / 二叉堆 (平铺数组) / 后缀数组
  ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐
  │  0  │  1  │  2  │  3  │  4  │  5  │  6  │  7  │ ──► 单次加载命中整条 Cache Line (64B)
  └─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘

[分块连续布局] ─────── Cache 友好度: ★★★★☆
  B 树 / B+ 树节点
  ┌──────────────────────────────────────────────┐
  │ [K0, K1, K2] + [P0, P1, P2, P3] (紧凑平铺)     │ ──► 节点内局部二分查找高命中
  └──────────────────────────────────────────────┘

[离散指针布局] ─────── Cache 友好度: ★☆☆☆☆
  单/双向链表 / AVL / 红黑树 / 后缀树
  ┌──────┐         ┌──────┐         ┌──────┐
  │ Node ├──ptr───►│ Node ├──ptr───►│ Node │ ──► 指针追逐 (Pointer Chasing)，每步触发 Cache Miss
  └──────┘         └──────┘         └──────┘
```

**工程选型启示**：

1. **小规模数据 ($n < 64$)**：即使红黑树具有 $O(\log n)$ 理论优势，未排序数组线性扫描甚至往往比树上查找更快，因其彻底规避了分支预测失败与 CPU 缓存缺失。
2. **读多写少的高性能内存表**：优先选择平铺数组或扁平跳表（Flat SkipList），而非纯节点指针式红黑树。

***

[<- 第 15 章　后缀树与后缀数组](/datastructure-docs/di-ba-bu-fen-gao-ji-zi-fu-chuan/15-suffix-tree-and-array.md) | [课程目录](/datastructure-docs/readme.md) | [附录 B：常见面试题与练习 ->](/datastructure-docs/fu-lu/appendix-b-exercises.md)
