数据结构与算法自学:从工程直觉到复杂度思维
一本写给有编程经验、但没系统学过数据结构与算法的工程师的自学书。
这本书为谁写
| 项 | 说明 |
|---|---|
| 适合你,如果你 | 有 1–3 年工作经验,会写循环、函数、类,用过 List<T> 和 Dictionary |
| 不需要 | 高等数学、算法基础、竞赛经历 |
| 代码语言 | C# 12 / .NET 8(每段都附等效伪代码,可用任意语言对照) |
| 数学要求 | 只用四则运算、乘方、对数概念、求和。不涉及微积分与概率论 |
| 深度 | 中级:覆盖本科数据结构与算法核心,砍掉严格证明与冷门结构 |
三个特点
一、每一节的结论都用真实代码跑过
这是这本书区别于其他教材的地方。
代码不是"示意"的 —— 每一节都配一个完整可运行的控制台项目, 正文里贴出的输出,是从控制台直接复制过来的,包括机器配置和倍率。
涉及算法正确性的结论,还会用【另一个独立实现】交叉校验:
- 12.3 节的 BFS 最短路,用暴力枚举 240 组验过
- 13.3 节的 Dijkstra,用 Floyd-Warshall 对拍 225 个顶点
- 14.1 节的贪心找零,与动态规划逐金额对比
- 16.3 节的调度器,用独立实现重放规则做验收
为什么这么麻烦? 因为不能让一个算法自己验证自己。
二、如实呈现"实测和教科书说法不符"的地方
全书有 25 处推翻了教科书说法的实测结论,比如:
| 结论 | 出处 |
|---|---|
| 已排序数据上,插入排序比归并排序快 8.5 倍 | 8.1 |
| 开放寻址探测次数更多却更快 | 6.2 |
| 随机稀疏图上,Bellman-Ford 比 Dijkstra 快 5.6 倍 | 13.4 |
| 同一个算法,只改遍历顺序就差 2.15 倍 | 16.2 |
| "找零用贪心"在随机币制里只有 2.5% 成立 | 14.1 |
遇到"实测和预期不符"时,这本书的做法是: 不调整数据去迎合预期,而是如实呈现并解释为什么。
往往那里就是最有教学价值的地方。
三、练习都有完整答案,而且给的是【关键步骤】
这本书假定你在自学 —— 没有老师可以问。
所以每节的 4–5 道练习都有完整解答,包括推导过程、中间步骤, 以及"为什么这么想",而不只是最后那个数。
怎么用这本书
建议节奏:16 周,每周 1 章,每章 4–5 节,每周投入 4–6 小时。
每节的结构是固定的:
学习目标 → 直觉 → 形式化 → 例题 → 可运行代码 → 练习 → 答案 → 常见错误 → 本节总结
三条使用建议:
- 每节的代码请亲手跑一遍。 光看不算数 —— 这本书的很多结论,只有跑起来才会信。
- 先自己做练习,再看答案。 答案很详细,直接看会少一半收获。
- 不要在"常见错误"上跳过。 那里面每一条都是真踩过的坑。
环境准备
只有一个要求:安装 .NET SDK 8。
每一节的代码都是独立项目,可以单独运行:
dotnet run --project 99-tools/samples/Ch01/Sec11/Sec11.csproj -c Release
请务必加
-c Release。 Debug 模式下的计时结果没有参考价值 —— 这句话本身在第 16.2 节被实测验证过。
装不了 .NET 也没关系 —— 每段代码都附了等效伪代码,用任何语言对照阅读都可以。
这本书不含什么
为了控制在 63 节以内,以下内容被砍掉了(在最后一节的"接下来学什么"里给了继续学习的建议):
并查集、字符串算法(KMP / Trie)、最小生成树、强连通分量、 A* 启发式搜索、计算复杂性理论的完整展开、概率数据结构。
开始之前
如果你只有 10 分钟,先读 1.1 节 —— 它用一个真实的上线事故说明"代码能跑通"和"代码能扛住真实数据"是两件不同的事。
如果你在准备面试,可以直接跳到各章的"常见错误"和练习题。
读完之后,你会得到三样东西:
- 一套判断代码性能的工具(而不是"感觉这里有点慢")
- 一批能亲手实现的数据结构与算法
- 一个习惯:任何性能结论,都要跑一遍才算数