本文翻译自 Algorithms with TypeScript - Preface,原载于 Hacker News。
为什么需要这本书?
这本书源于一个简单的观察:大多数软件工程师每天都在使用算法和数据结构,但很多人对基础知识感到不确定。他们可能使用哈希表或调用排序函数,却不完全理解这些抽象提供的保证;或者当问题需要从头设计新算法时,他们会感到困难。
与此同时,计算机科学专业的学生通常在高度理论化的环境中接触算法,这与他们实际编写的代码感觉脱节。
《Algorithms with TypeScript》填补了这一鸿沟。
这本书呈现了典型本科算法课程中的核心算法和数据结构——大致相当于 MIT 的 6.006 和 6.046 课程——但使用 TypeScript 作为表达语言。书中讨论的每个算法都已实现、测试,并可在配套仓库中获取。这些实现不是伪代码翻译成 TypeScript,而是地道的、类型安全的、使用现代工具链测试的代码。
目标读者
这本书面向两类读者:
1. 软件工程师
如果你想在工作中巩固对算法和数据结构的理解,这本书适合你。也许你几年前学过这些内容想复习一下,或者你是自学成才想填补空白。无论哪种情况,在你工作中可能使用的语言——TypeScript——中看到算法,会让这些内容立即可用。
2. 计算机科学学生
如果你正在学习(或准备学习)算法课程,这本书可以作为参考。本书遵循标准课程顺序,每章末尾都包含练习题。TypeScript 实现让你可以运行、修改和实验每个算法。
前置要求
本书假设你能读写基本的 TypeScript 或 JavaScript。你应该熟悉函数、循环、条件语句、数组和对象。不需要先验的算法或数据结构知识——我们从基础开始构建一切,从第 1 章算法定义开始。
有些章节使用数学符号,特别是复杂度分析。第 2 章介绍了渐进符号(O、Ω、Θ),前言后的符号部分总结了书中使用的所有约定。熟悉基础代数和数学推理会有帮助,但不是严格要求;我们会在每个概念出现时进行解释。
书籍结构
本书分为六个部分:
- 第一部分:基础(第 1-3 章)介绍算法概念、分析算法的数学工具,以及递归与分治。
- 第二部分:排序与选择(第 4-6 章)涵盖经典排序算法,从基础的 O(n²) 方法到 O(n log n) 比较排序,再到线性时间非比较排序和选择算法。
- 第三部分:数据结构(第 7-11 章)介绍基础数据结构:数组、链表、栈、队列、哈希表、树、平衡搜索树、堆和优先队列。
- 第四部分:图算法(第 12-15 章)涵盖图的表示、遍历、最短路径、最小生成树和网络流。
- 第五部分:算法设计技巧(第 16-17 章)探索动态规划和贪心算法作为通用问题解决策略。
- 第六部分:高级主题(第 18-22 章)涵盖并查集、字典树、字符串匹配、计算复杂度和近似算法。
各部分设计为按顺序阅读,因为后面的章节建立在前面介绍的概念和数据结构之上。在每个部分内,章节很大程度上是独立的——如果你对前置知识感到舒适,通常可以独立阅读单个章节。
每章遵循一致的结构:动机性介绍、形式定义、带有逐步追踪的详细算法描述、带有代码片段的 TypeScript 实现、复杂度分析和练习题。练习题从简单的理解检查到更具挑战性的扩展问题不等。
代码实现
所有实现都位于仓库的 src/ 目录中,按章节组织。测试在 tests/ 目录中,结构与源代码平行。要运行完整测试套件:
npm install
npm test
代码使用 TypeScript 5 编写,启用严格模式,使用 ES 模块,并用 Vitest 进行测试。详细设置说明请参阅项目 README。
我们鼓励你边读文本边读代码。 实现设计为清晰可读,而非最大程度优化。当清晰度和性能存在冲突时,我们选择清晰度,并在文本中讨论性能影响。
致谢
本书从几本优秀教材中汲取灵感,最著名的是 Cormen、Leiserson、Rivest 和 Stein 的《算法导论》(CLRS),Sedgewick 和 Wayne 的《算法》,Niklaus Wirth 的《算法 + 数据结构 = 程序》,以及 Kleinberg 和 Tardos 的《算法设计》。MIT OpenCourseWare 的 6.006 和 6.046 材料在塑造课程方面非常有价值。完整参考文献请参阅书目。
注意:本书目前处于 Beta 阶段,仍在积极审阅中。可能包含错误或不完整的部分。欢迎通过 GitHub 仓库报告错误或问题——也欢迎贡献。
个人点评
作为一个用 TypeScript 的开发者,我觉得这本书的价值在于:
- 类型安全的算法实现 - 算法教学通常用伪代码或 C/C++,但 TypeScript 的类型系统能帮助理解数据流动
- 配套可运行的代码 - 不是纸上谈兵,每段代码都能跑、能调试
- MIT 课程水准 - 内容对标 6.006/6.046,覆盖了从基础到高级的完整知识体系
如果你正在准备技术面试,或者想系统性地提升算法能力,这本书是一个很好的资源。特别是对于那些已经在用 TypeScript 工作的开发者,学习曲线会更平缓。
GitHub 仓库:代码完全开源,可以 clone 下来跟着书一起学习。