Skip to content

第一章 抽象、复杂度与内存模型


1. 为什么数据结构必须从“抽象”开始

很多初学者一提到数据结构,就会立刻想到数组、链表、栈、队列、树、图,好像这门课的任务只是把这些名词逐个记住。这个理解太浅。数据结构真正研究的是这样一个链条:现实问题里有哪些对象,这些对象之间存在什么关系,这些关系应当如何表示到内存中,程序要支持哪些操作,这些操作在时间和空间上分别要付出什么代价。

如果没有这个链条,学习就会退化成死记硬背。你可能记得“数组查找快”“链表插入快”,但一旦别人追问“为什么”“什么条件下成立”“代码里是怎么体现的”,就答不上来。数据结构课程的价值,恰恰就在于把“程序能跑”提升为“程序为什么这样组织才更合理”。

上面这条链路决定了本专题的写法。我们不是先看代码再猜原理,而是先讲抽象,再讲内存,再讲实现,最后再做复杂度比较。

2. 什么是数据结构

数据结构可以理解为“带有组织关系的数据,以及作用在这些数据上的操作规则”。因此它至少包含两部分:

  1. 数据之间的关系。
  2. 对这些数据可执行的操作。

例如“学生成绩表”这个对象,如果只是孤零零的一堆数字,不构成数据结构;只有当我们关心这些数字按照什么顺序存储、如何按学号查找、如何插入新同学、如何统计排名时,它才进入数据结构的讨论范围。

更严格地说,数据结构并不是单纯描述“数据长什么样”,而是在回答“数据应该怎样组织,程序才能更高效地处理它”。这也是为什么数据结构和算法总是连在一起:结构决定操作边界,算法利用这些边界。

3. 抽象数据类型:先定义行为,再讨论实现

4. 数据结构研究的四个层面

4.1 逻辑结构

4.2 存储结构

4.3 操作集合

4.4 复杂度

5. 时间复杂度:不是“运行时间”,而是增长规律

6. 空间复杂度与额外空间

7. 内存模型:为什么“连续”和“链接”会产生本质差异

7.1 连续内存

7.2 链式内存

8. Go 语言中的内存视角

9. 第一章必须建立的三条主线

9.1 先问关系,再问实现

9.2 先问主操作,再问容器名字

9.3 复杂度结论必须能还原到内存原因

10. 进入后续章节前,你应当会回答的问题