具体描述
本书分为准备篇、基础篇和应用篇三大部分,借助在线评测系统Aizu Online Judge以及大量例题,详细讲解了算法与复杂度、初等和高等排序、搜索、递归和分治法、动态规划法、二叉搜索树、堆、图、计算几何学、数论等与程序设计竞赛相关的算法和数据结构,既可以作为挑战程序设计竞赛的参考书,也可以用来引导初学者系统学习算法和数据结构的基础知识。本书适合所有程序设计人员、程序设计竞赛爱好者以及高校计算机专业师生阅读。
作者简介
渡部有隆(作者)
出生于1979年,计算机理工学博士。会津大学计算机理工学部信息系统学部门副教授。专业领域为可视化编程语言。AIZU ONLINE JUDGE开发者。
Ozy(审校)
本名冈田佑一,出生于日本大阪的短码高手。他花费相当长的时间提升短码编程技术,进而将其发展成一种技能,曾获得程序设计大赛的冠军。他开办过程序设计方面的培训班,目前致力于数学教育和程序设计师的培养工作。曾著有《短码之美:变成达人的心得技法》(人民邮电出版社)。
秋叶拓哉(审校)
2011年考入东京大学研究生院。以iwi的昵称活跃在程序设计竞赛中。TopCoder评级好成绩为世界第四(2013年)。《挑战程序设计竞赛(第2版)》(人民邮电出版社)作者之一。
目录信息
第1章 有效运用在线评测系统 3
1.1 攻克程序设计竞赛的学习方法 3
1.2 什么是在线评测 7
1.3 用户注册 9
1.4 浏览问题 10
1.5 解答问题 12
1.6 个人页面 18
1.7 如何运用本书 19
第2部分 [基础篇]为程序设计竞赛做准备的算法与数据结构 21
第2章 算法与复杂度 23
2.1 算法是什么 23
2.2 问题与算法示例 23
2.3 伪代码 25
2.4 算法的效率 26
2.5 入门问题 28
第3章 初等排序 33
3.1 挑战问题之前——排序 33
3.2 插入排序法 35
3.3 冒泡排序法 40
3.4 选择排序法 44
3.5 稳定排序 48
3.6 希尔排序法 52
第4章 数据结构 57
4.1 挑战问题之前——什么是数据结构 57
4.2 栈 59
4.3 队列 64
4.4 链表 70
4.5 标准库的数据结构 77
4.6 数据结构的应用——计算面积 86
第5章 搜索 89
5.1 挑战问题之前——搜索 89
5.2 线性搜索 91
5.3 二分搜索 94
5.4 散列法 98
5.5 借助标准库搜索 102
5.6 搜索的应用——计算最优解 106
第6章 递归和分治法 109
6.1 挑战问题之前——递归与分治 109
6.2 穷举搜索 111
6.3 科赫曲线 114
第7章 高等排序 119
7.1 归并排序 120
7.2 分割 125
7.3 快速排序 129
7.4 计数排序 133
7.5 利用标准库排序 137
7.6 逆序数 139
7.7 最小成本排序 143
第8章 树 147
8.1 挑战问题之前——树结构 148
8.2 有根树的表达 150
8.3 二叉树的表达 154
8.4 树的遍历 159
8.5 树遍历的应用——树的重建 163
第9章 二叉搜索树 167
9.1 挑战问题之前——二叉搜索树 168
9.2 二叉搜索树——插入 169
9.3 二叉搜索树——搜索 174
9.4 二叉搜索树——删除 177
9.5 通过标准库管理集合 182
第10章 堆 189
10.1 挑战问题之前——堆 190
10.2 完全二叉树 191
10.3 最大/最小堆 193
10.4 优先级队列 197
10.5 通过标准库实现优先级队列 201
第11章 动态规划法 203
11.1 挑战问题之前——动态规划法的概念 203
11.2 斐波那契数列 204
11.3 最长公共子序列 208
11.4 矩阵链乘法 211
第12章 图 217
12.1 挑战问题之前——图 218
12.2 图的表示 221
12.3 深度优先搜索 224
12.4 广度优先搜索 232
12.5 连通分量 237
第13章 加权图 241
13.1 挑战问题之前——加权图 242
13.2 最小生成树 244
13.3 单源最短路径 249
第3部分 [应用篇]程序设计竞赛的必备程序库 261
第14章 高等数据结构 263
14.1 互质的集合 264
14.2 范围搜索 269
14.3 其他问题 278
第15章 高等图算法 279
15.1 所有点对间最短路径 280
15.2 拓扑排序 284
15.3 关节点 290
15.4 树的直径 295
15.5 最小生成树 299
15.6 其他问题 303
第16章 计算几何学 305
16.1 几何对象的基本元素与表现 306
16.2 直线的正交/平行判定 312
16.3 投影 314
16.4 映象 316
16.5 距离 317
16.6 逆时针方向 321
16.7 判断线段相交 324
16.8 线段的交点 326
16.9 圆与直线的交点 328
16.10 圆与圆的交点 331
16.11 点的内包 333
16.12 凸包 335
16.13 线段相交问题 339
16.14 其他问题 343
第17章 动态规划法 345
17.1 硬币问题 346
17.2 背包问题 349
17.3 最长递增子序列 353
17.4 最大正方形 357
17.5 最大长方形 360
17.6 其他问题 364
第18章 数论 367
18.1 质数检验 368
18.2 最大公约数 372
18.3 幂乘 376
18.4 其他问题 378
第19章 启发式搜索 381
19.1 八皇后问题 382
19.2 九宫格拼图 386
19.3 十六格拼图 391
附录 399
通过本书可以获得的技能 400
挑战以往的程序设计竞赛真题! 402
参考文献 404
· · · · · · (收起)
读后感
我是大一新手,之前看过挑战程序设计竞赛的前一版本,也看过刘汝佳的书,但是这几本书后面几个章节都太难了,对我这种没有老师教的读起来太吃力了。但是这本书非常适合0基础入门,讲的非常好。我用几天时间把这书扫了一遍,收获很大。有评论的同学说不好,可能是因为书的内容太...
我是大一新手,之前看过挑战程序设计竞赛的前一版本,也看过刘汝佳的书,但是这几本书后面几个章节都太难了,对我这种没有老师教的读起来太吃力了。但是这本书非常适合0基础入门,讲的非常好。我用几天时间把这书扫了一遍,收获很大。有评论的同学说不好,可能是因为书的内容太...
我是大一新手,之前看过挑战程序设计竞赛的前一版本,也看过刘汝佳的书,但是这几本书后面几个章节都太难了,对我这种没有老师教的读起来太吃力了。但是这本书非常适合0基础入门,讲的非常好。我用几天时间把这书扫了一遍,收获很大。有评论的同学说不好,可能是因为书的内容太...
我是大一新手,之前看过挑战程序设计竞赛的前一版本,也看过刘汝佳的书,但是这几本书后面几个章节都太难了,对我这种没有老师教的读起来太吃力了。但是这本书非常适合0基础入门,讲的非常好。我用几天时间把这书扫了一遍,收获很大。有评论的同学说不好,可能是因为书的内容太...
我是大一新手,之前看过挑战程序设计竞赛的前一版本,也看过刘汝佳的书,但是这几本书后面几个章节都太难了,对我这种没有老师教的读起来太吃力了。但是这本书非常适合0基础入门,讲的非常好。我用几天时间把这书扫了一遍,收获很大。有评论的同学说不好,可能是因为书的内容太...
用户评价
坦白说,我之前对算法和数据结构一直抱有一种“敬而远之”的态度,总觉得它们是属于那些数学功底深厚、智商超群的人才能掌握的领域。这本书彻底改变了我的看法。它用一种非常亲切和易于理解的方式,将复杂的算法概念层层剥开,展现出它们背后简洁而优美的逻辑。书中大量的图示和比喻,让那些抽象的概念变得具体可感,不再是冰冷的符号。我印象最深刻的是,作者在讲解动态规划时,用了非常形象的比喻,让我一下子就抓住了核心思想。而且,这本书不仅仅是“讲”算法,更是“教”你如何“想”算法。它引导你去思考问题的本质,去寻找最优的解决方案,而不是仅仅停留在模仿现有的代码。我常常会自己先尝试解决一个问题,然后再对照书中的讲解,对比自己的思路和书中的方法,从中找出自己的不足,并学习新的解题技巧。这种主动学习的过程,让我感觉自己不仅仅是在被动接受知识,更是在主动构建自己的知识体系。
说实话,当初买这本书,主要是想提升一下自己的实战能力,毕竟光看一些零散的算法介绍,总是感觉缺乏系统性。这本书最大的亮点在于它的“实战导向”,它不是让你去背诵那些冷冰冰的公式和定义,而是让你直接面对那些在实际竞赛中会遇到的难题。每一次讲解,都紧密围绕着一个具体的题目展开,让你亲身体验算法的威力。我特别喜欢书中对一些难点问题的分析,作者会从多个角度去剖析,给出不同的解法,并且还会对比它们的优劣。这种深度分析,让我不仅仅是学会了一个算法,更是理解了为什么这个算法是最好的选择。而且,它还提供了一些实用的技巧和陷阱提示,这些经验之谈,对于我这种初学者来说,简直是无价之宝。我记得有一次,我被一个题卡了好久,后来翻到这本书的相应章节,发现作者给出的思路和优化方法,一下子就点醒了我,那种感觉就像是豁然开朗。这本书真的就像一位经验丰富的老前辈,在默默地指导你如何披荆斩棘。
我一直觉得,学习算法,最怕的就是“纸上谈兵”。这本书在这方面做得非常好,它把抽象的算法概念,转化成了具体的、可操作的代码实现。每一个算法,都配有清晰的代码示例,而且这些代码不是那种“伪代码”或者简化的版本,而是可以直接运行,并且经过了充分的测试。我最喜欢的地方在于,它不仅展示了算法的核心逻辑,还会讲解一些工程上的细节,比如如何处理边界条件,如何进行时间复杂度和空间复杂度的分析。这些细节,虽然看起来微小,但对于写出健壮、高效的代码至关重要。通过跟着书中的代码进行实践,我不仅巩固了对算法的理解,更重要的是,我的编程风格也得到了很大的改善。我开始学会如何写出更简洁、更清晰、更易于维护的代码。而且,书中的很多题目,我都尝试自己动手去实现,即使一开始遇到困难,也能从书中的示例中找到灵感。这种“做中学”的方式,让学习过程变得更加有趣和有效。
这套书简直是我的救星!我一直对ACM、ICPC这些名字耳熟能详,但感觉自己离他们遥不可及,总觉得算法和数据结构是高不可攀的“学术难题”。看书名就觉得有点压力,但又忍不住好奇。拿到手后,第一感觉是厚重,感觉里面塞满了干货。我最头疼的就是概念理解,很多时候看一遍书或者听完课,还是云里雾里。这套书的讲解方式很独特,它不是那种枯燥的理论堆砌,而是通过一个个经典的竞赛题目,把抽象的算法和数据结构变得生动形象。你会发现,原来这些复杂的概念,在解决实际问题时是多么的巧妙和高效。我尤其喜欢它那种循序渐进的讲解模式,从基础概念到进阶技巧,每一步都衔接得很自然,不会让你觉得突然跳跃。而且,它还附带了大量的代码示例,虽然我一开始看代码有点发怵,但跟着它一步一步调试,慢慢地就理解了每个算法的实现细节。有时候,我会对着题目和代码反复琢磨,那种“啊!原来是这样!”的顿悟感,真的太爽了。感觉自己的编程逻辑和解决问题的能力,都得到了质的提升。
在我眼中,这本书不仅仅是一本学习算法的教材,更像是一本“武功秘籍”。它没有那种炫技式的、晦涩难懂的讲解,而是用一种非常朴实、务实的方式,将那些强大的算法和数据结构的力量,毫无保留地传授给你。我尤其欣赏书中对“效率”的极致追求。它会深入地分析不同算法在时间复杂度和空间复杂度上的表现,让你明白为什么在特定的场景下,选择某个算法会带来巨大的性能提升。书中提供的那些经过精心设计的练习题,覆盖了各种典型的算法应用场景,每一个题目都像是为你量身定做的“实战演练”。通过解决这些题目,我不仅巩固了对书中知识的理解,更重要的是,我学会了如何将学到的算法灵活地运用到实际问题中。这本书让我明白,学习算法不仅仅是为了通过考试,更是为了让我的代码跑得更快,解决问题更高效。感觉自己现在面对编程挑战时,底气足了很多。
基于OJ系统的习题集,可能难度和竞赛有距离,但是学数据结构和算法可以参考,难得使用C语言。最喜欢的是开本和排版,真是舒适的阅读体验。
ACM
我觉得还行,难度对于竞赛有欠缺,数据结构与算法讲得不错
我觉得还行,难度对于竞赛有欠缺,数据结构与算法讲得不错
插图形象,帮助理解,入门好选择!很多都讲得不深,需要参考其他资料。但是真的挺全面的。