《竞赛程序员手册》(2018)[PDF]

查看原文 HN 讨论

文章摘要

这次的链接是一本完整的书:芬兰赫尔辛基大学 Antti Laaksonen 撰写的《Competitive Programmer’s Handbook》(竞赛程序员手册)。它免费托管在 CSES 网站上,PDF 共 296 页,封面标注为 2018 年 7 月 3 日的草稿版。这本书在 HN 上已经被反复提交过多次,本文不翻译书中内容,只概述它的定位、结构和特点。

定位。 作者在前言中说,这本书旨在全面介绍算法竞赛,读者需要已经掌握编程基础,但不需要任何竞赛背景。它主要面向想学习算法、参加国际信息学奥林匹克(IOI)或国际大学生程序设计竞赛(ICPC)的学生,当然对竞赛编程感兴趣的人都适合读。作者坦言,成为优秀的竞赛选手需要很长时间,但这也是大量学习的机会——只要花时间读书、做题、参赛,就一定能对算法建立起扎实的整体理解。

全书结构。 全书 30 章,分为三大部分:

  1. 基础技术(第 1–10 章):从竞赛入门讲起,包括语言选择、输入输出、数值处理、精简代码的技巧、常用数学知识以及比赛和学习资源;接着是时间复杂度、排序与二分查找、C++ 标准库数据结构(动态数组、set、map、迭代器等)、完全搜索(子集和排列生成、回溯、剪枝、折半搜索)、贪心算法、动态规划(硬币问题、最长上升子序列、背包、编辑距离、铺砖计数)、均摊分析(双指针、单调栈、滑动窗口最小值)、区间查询(前缀和、树状数组、线段树)以及位运算技巧。
  2. 图算法(第 11–20 章):图的基本概念与表示、DFS/BFS 遍历、最短路(Bellman–Ford、Dijkstra、Floyd–Warshall)、树上算法(直径、二叉树)、生成树(Kruskal、并查集、Prim)、有向图(拓扑排序、后继路径、判环)、强连通分量(Kosaraju 算法与 2-SAT)、树上查询(祖先、子树与路径、最近公共祖先、离线算法)、欧拉路径与哈密顿路径(包括 De Bruijn 序列和骑士巡游),以及网络流与割(Ford–Fulkerson、最大匹配、路径覆盖)。
  3. 进阶主题(第 21–30 章):数论(素数、模运算、解方程)、组合数学(二项式系数、卡特兰数、容斥原理、Burnside 引理、Cayley 公式)、矩阵(线性递推的矩阵快速幂)、概率(期望、马尔可夫链、随机化算法)、博弈论(Nim 游戏、Sprague–Grundy 定理)、字符串算法(Trie、字符串哈希、Z 算法)、平方根分解(包括莫队算法)、线段树进阶(懒标记、动态开点、二维)、计算几何(用复数表示点、多边形面积、距离函数),以及扫描线算法(求交点、最近点对、凸包)。

写法与特点。

总体来看,这是一本免费、紧凑、体系完整的算法竞赛入门到进阶教材,也常被当作算法速查手册和面试准备材料。

HN 评论精华

帖子获得约 320 分、85 条评论。dang 列出了此前的多次讨论(2017、2018 年各有百余条评论的帖子)。值得一提的是,评论区一开始就被一条关于「职业把关」的争议性评论带偏,后面相当一部分讨论围绕 LLM 时代刷题还有没有意义、竞赛编程与面试的关系展开,真正讨论书本身的内容不算多。

开局争议:要不要「把关」这个行业

关于这本书

LLM 时代还要刷题吗

竞赛编程与面试文化