数据结构这门课,基本是所有计算机相关专业都绕不过去的一门基础课。考研要考它,软考要考它,刷题要会它,再往后做业务系统设计表结构、设计缓存方案,底层也离不开它。可翻开教材第一章,很多人就被一句话卡住了:“数据结构是相互之间存在一种或多种特定关系的数据元素的集合。”到底什么叫数据元素?“关系”又指什么?这句话读十遍也未必能体会出来。
我当年学的时候也一样。老师在黑板上写定义,我一边抄一边觉得这门课大概就是背概念。但后来自己动手写程序,做过通讯录、写过管理系统、也碰过一点检索相关的东西,才慢慢理解那句话其实很实在:数据结构要解决的不是你会不会写 if 和 for,而是当你面对一堆乱糟糟的数据时,有没有能力把它们整理成计算机可以高效处理的样子。这篇文章不打算堆术语,而是想把这些东西像聊经验一样拆开,适合刚开始学数据结构的人看,也适合那些学了半学期还处于“好像懂了又说不出是什么”状态的同学。
1. 先弄清楚:数据结构这门课到底在讨论什么
翻开常见教材的目录,大多数书都是绪论、线性表、栈和队列、串、数组与广义表、树、图、查找、排序。乍一看像是很多孤立主题的集合,但顺着主线看,其实是同一个问题的不同难度版本。
计算机程序每时每刻都在处理数据。单独写一个 int a = 3 可能不需要数据结构知识;但如果程序要管理全校学生的成绩,要按学号查找某位学生的分数,要按总分从高到低把名单排出来,还要处理学生不断转进转出的情况,这些数据之间就有了复杂的联系。此时只知道 int 和 float 显然不够,还得考虑学生和学生之间是按班级组织还是按学号排序,选课记录和课程之间是“一对一”“一对多”还是“多对多”。这些关系如果不显式表达出来,代码很快就会变成一团乱麻。
数据结构课程其实围绕三个核心问题展开,记住这三个,后面不容易迷路。
- 逻辑结构:数据元素在人脑的逻辑中是什么样的关系,像排队、像树、还是像一张网。
- 存储结构:这些逻辑关系放进内存以后,用连续空间还是靠指针串起来。
- 数据运算:在给定结构上能执行哪些操作,每种操作成本多高。
这三个问题会反复出现在每一个章节里。线性表解决“一串数据怎么组织”,树解决“一对多关系怎么组织”,图解决“多对多关系怎么组织”,查找与排序则是这些结构上最典型的高级操作。
1.1 为什么非要有“数据元素”和“关系”这两个概念
先回答一个容易困扰新人的问题:既然语言里已经有数组、结构体、对象,为什么还要专门发明“数据元素”这种听起来拗口的词?
因为数据结构要讨论的,不是某一个具体成绩或者某一个具体姓名,而是通用的组织模式。就像数学里说“变量 x”,它可以代指任何数,数据结构里说“数据元素”,它就可以代指一条订单、一个学生、一个网页结点,甚至是一张数据库表的某一行。数据元素的基本单位摆在这里后,再去讨论它们之间的一对一、一对多、多对多关系,才能有一套放之四海而皆准的表达方式。
“关系”这个词也值得
