主题
第一章 抽象、复杂度与内存模型
1. 为什么数据结构必须从“抽象”开始
很多初学者一提到数据结构,就会立刻想到数组、链表、栈、队列、树、图,好像这门课的任务只是把这些名词逐个记住。这个理解太浅。数据结构真正研究的是这样一个链条:现实问题里有哪些对象,这些对象之间存在什么关系,这些关系应当如何表示到内存中,程序要支持哪些操作,这些操作在时间和空间上分别要付出什么代价。
如果没有这个链条,学习就会退化成死记硬背。你可能记得“数组查找快”“链表插入快”,但一旦别人追问“为什么”“什么条件下成立”“代码里是怎么体现的”,就答不上来。数据结构课程的价值,恰恰就在于把“程序能跑”提升为“程序为什么这样组织才更合理”。
上面这条链路决定了本专题的写法。我们不是先看代码再猜原理,而是先讲抽象,再讲内存,再讲实现,最后再做复杂度比较。
2. 什么是数据结构
数据结构可以理解为“带有组织关系的数据,以及作用在这些数据上的操作规则”。因此它至少包含两部分:
- 数据之间的关系。
- 对这些数据可执行的操作。
例如“学生成绩表”这个对象,如果只是孤零零的一堆数字,不构成数据结构;只有当我们关心这些数字按照什么顺序存储、如何按学号查找、如何插入新同学、如何统计排名时,它才进入数据结构的讨论范围。
更严格地说,数据结构并不是单纯描述“数据长什么样”,而是在回答“数据应该怎样组织,程序才能更高效地处理它”。这也是为什么数据结构和算法总是连在一起:结构决定操作边界,算法利用这些边界。
