新書推薦:
《
服务的细节136:提高成交率的50个销售技巧
》
售價:NT$
296.0
《
变法与党争:大明帝国的衰亡(1500—1644)
》
售價:NT$
439.0
《
大学问·中国的现代化:1850年以来的历史轨迹
》
售價:NT$
490.0
《
再造乡土:1945年后法国农村社会的衰落与重生
》
售價:NT$
436.0
《
博弈与平衡:奥格斯堡城市宗教改革研究(1518-1537)
》
售價:NT$
551.0
《
古代中国与南亚文明论丛
》
售價:NT$
281.0
《
Hygge Home(为什么我只想待在家)
》
售價:NT$
449.0
《
AI时代:弯道超车新思维
》
售價:NT$
356.0
|
內容簡介: |
算法是一系列解决问题的清晰指令,是程序设计的灵魂。同一问题可采用不同的算法解决,而一个算法的优劣将直接影响程序的执行效率。本书以ACM程序设计竞赛的题目为基础,详细介绍一些常用的算法以及相关的理论知识,主要内容包括高级数据结构、字符串、动态规划进阶算法、图论高级算法、经典算法问题、组合数学、计算几何、组合游戏论。
|
關於作者: |
梁冰,女,博士,计算机应用技术专业,毕业于哈尔滨工程大学,现工作于大连理工大学,大连理工大学创新创业学院ACMICPC实验室主任,长期负责算法的教学创新和学院学生参加ACM大赛的指导工作。
|
目錄:
|
目录
第1章 高级数据结构(1)
1.1 堆(1)
1.1.1 堆的定义(1)
1.1.2 建堆(1)
1.1.3 堆排序算法(2)
1.2 树状数组(3)
1.2.1 树状数组的定义(4)
1.2.2 树状数组的实现和使用(4)
1.2.3 例题讲解(5)
1.3 左倾堆(7)
1.3.1 左倾堆相关定义和性质(7)
1.3.2 左倾堆的操作(7)
1.3.3 例题讲解(8)
1.4 平衡二叉树(10)
1.4.1 Treap(11)
1.4.2 Splay树(13)
1.4.3 例题讲解(18)
1.5 练习题(22)
第2章 字符串(24)
2.1 Trie树(24)
2.1.1 Trie树的原理(24)
2.1.2 Trie树的实现(25)
2.1.3 例题讲解(26)
2.2 KMP算法(29)
2.2.1 KMP算法的原理(29)
2.2.2 KMP算法的实现(31)
2.2.3 例题讲解(32)
2.3 Aho-Corasick自动机(35)
2.3.1 Aho-Corasick自动机原理(35)
2.3.2 Aho-Corasick自动机算法的实现(37)
2.3.3 例题讲解(39)
2.4 后缀数组(43)
2.4.1 后缀数组基本原理(43)
2.4.2 后缀数组的应用(46)
2.4.3 例题讲解(49)
2.5 练习题(54)
第3章 动态规划进阶算法(57)
3.1 树状DP(57)
3.1.1 树状DP的定义(57)
3.1.2 树状DP解题方法(58)
3.1.3 例题讲解(58)
3.2 状态压缩DP(62)
3.2.1 集合的整数表示(62)
3.2.2 例题讲解(63)
3.3 动态规划的优化方法(66)
3.3.1 单调队列优化的动态规划(66)
3.3.2 例题讲解(66)
3.3.3 斜率优化的动态规划(68)
3.3.4 例题讲解(68)
3.3.5 四边形不等式优化的动态规划(71)
3.3.6 例题讲解(71)
3.4 练习题(73)
第4章 图论高级算法(76)
4.1 最大流(76)
4.1.1 最大流的定义(76)
4.1.2 增广路算法涉及的三个重要概念(77)
4.1.3 Edmonds-Karp算法(79)
4.1.4 Dinic算法(82)
4.1.5 ISAP算法(84)
4.1.6 网络流的建图(89)
4.1.7 例题讲解(91)
4.2 最小费用流(99)
4.2.1 最小费用流算法(99)
4.2.2 例题讲解(100)
4.3 二分图匹配(109)
4.3.1 二分图的定义(109)
4.3.2 二分图的最大匹配(109)
4.3.3 二分图的性质与应用(114)
4.3.4 例题讲解(115)
4.4 练习题(118)
第5章 经典算法问题(121)
5.1 多项式与快速傅里叶变换(121)
5.1.1 多项式(121)
5.1.2 多项式的表示与多项式乘法(121)
5.1.3 DFT和FFT的实现(123)
5.1.4 例题讲解(124)
5.2 NP完全性(127)
5.2.1 NP问题简介(127)
5.2.2 哈密顿回路(127)
5.2.3 例题讲解(128)
5.3 对偶图问题(135)
5.3.1 基本概念(135)
5.3.2 平面图转化为对偶图(137)
5.3.3 对偶图的应用(140)
5.4 RMQ问题(144)
5.4.1 RMQ问题的简单求解方法(145)
5.4.2 ST(Sparse Table)算法(145)
5.4.3 例题讲解(146)
5.5 LCA问题(151)
5.5.1 LCA问题的简单求解方法(151)
5.5.2 基于倍增的双亲存储法(152)
5.5.3 高效的LCA算法(152)
5.5.4 例题讲解(154)
5.6 练习题(158)
第6章 组合数学(161)
6.1 排列组合(161)
6.1.1 基本计数原则(161)
6.1.2 排列(161)
6.1.3 组合(162)
6.1.4 例题讲解(163)
6.2 母函数(164)
6.2.1 母函数基础(165)
6.2.2 母函数的两类具体应用(165)
6.2.3 例题讲解(166)
6.3 整数划分(169)
6.3.1 从动态规划到母函数(169)
6.3.2 例题讲解(170)
6.4 Stirling数和Catalan数(172)
6.4.1 第一类Stirling数(172)
6.4.2 第二类Stirling数(173)
6.4.3 Catalan数(173)
6.4.4 例题讲解(174)
6.5 容斥原理与反演(179)
6.5.1 容斥原理(179)
6.5.2 反演理论(180)
6.5.3 Mobius反演(181)
6.5.4 例题讲解(184)
6.6 群论与Polya定理(187)
6.6.1 群的基本性质(187)
6.6.2 置换群(188)
6.6.3 Burnside定理及Polya定理(189)
6.6.4 例题讲解(190)
6.7 练习题(192)
第7章 计算几何(195)
7.1 多边形上的数据结构表示(195)
7.1.1 点(195)
7.1.2 线段(197)
7.1.3 多边形类(198)
7.1.4 例题讲解(199)
7.2 多边形相交问题(202)
7.2.1 线段相交(202)
7.2.2 多边形相交问题的讨论(203)
7.2.3 例题讲解(204)
7.3 多边形求面积(207)
7.3.1 计算多边形的面积(207)
7.3.2 格点数(208)
7.3.3 例题讲解(209)
7.4 凸包(210)
7.4.1 凸多边形(210)
7.4.2 凸多边形的性质(215)
7.4.3 构造凸包(215)
7.4.4 例题讲解(219)
7.5 相交问题(230)
7.5.1 半平面交(230)
7.5.2 凸多边形交(232)
7.5.3 例题讲解(232)
7.6 圆(240)
7.6.1 圆与线段的交(240)
7.6.2 圆与多边形的交的面积(241)
7.6.3 圆与圆的交的面积(241)
7.6.4 圆与圆的并的面积(245)
7.7 练习题(249)
第8章 组合游戏论(252)
8.1 组合游戏论中的游戏(252)
8.1.1 组合游戏论的定义(252)
8.1.2 博弈树模型(253)
8.1.3 巴什博弈(253)
8.1.4 威佐夫博弈(254)
8.1.5 例题讲解(255)
8.2 NIM游戏和SG函数(256)
8.2.1 NIM游戏的定义(256)
8.2.2 NIM游戏中的性质(256)
8.2.3 Sprague-Grundy函数的价值(257)
8.2.4 SG函数的应用(258)
8.2.5 例题讲解(259)
8.3 NIM游戏的变形(262)
8.3.1 ANTI-NIM问题(262)
8.3.2 Staircase NIM(264)
8.3.3 例题讲解(265)
8.4 练习题(267)
参考文献(269)
|
內容試閱:
|
前 言
这是一本关于算法的教程。算法是一系列解决问题的清晰指令,可以说它是程序设计的灵魂。同一问题可用不同的算法解决,而一个算法的质量优劣将影响程序的执行效率。算法分析的目的在于选择合适算法和改进算法。评价一个算法的好坏主要是通过算法运行的时间长短和占用空间的大小来评估的。对于计算机专业或者爱好计算机的人士来说,无论学习还是工作,或多或少都会应用一些算法的知识。而目前国内外大型互联网公司在招聘时的笔试和面试都以算法为主。可见,算法的重要性是不言而喻的。
ACMICPC(ACM International Collegiate Programming Contest)是一项由美国计算机协会主办的,旨在展示大学生创新能力、团队精神和在压力下编写程序、分析和解决问题能力的年度竞赛。ACM程序设计竞赛的题目强调算法的高效性与正确性。参赛选手只有编写出能够在规定时间内运行完成若干组数严格的测试数据,并且结果全部正确的程序才能得到分数。本书将以ACM程序设计竞赛的题目为基础,介绍一些经典的算法。
本书的目的是将更多对计算机和算法感兴趣,但又苦于无从入手的读者带进算法的大门,让刚迈入大学校门的学生学会使用C语言解决简单的问题。本书会依次介绍一些包括高级数据结构、字符串、动态规划、图论、组合数学方面的经典算法,相信当读者掌握了这些内容之后,会对算法和程序设计有一个新层次的认识,并会产生浓厚的兴趣。对于每个算法,本书都有图文并茂的讲解;在每章节的最后,都有针对该部分知识点的例题讲解,每道例题都是国内外著名程序在线判题系统中的原题,而且对于每道例题,都会从理解题意开始,详细讲解解题的思路,并附有完整的可以正确通过测试样例的代码,供读者研究学习。除了例题,在每章的最后还有一些练习题供读者巩固学到的知识,如果读者对这些习题仍感觉无从下手,可以参考每道练习题后附带的思路分析来帮助整理解题思路。
大连理工大学是在全国高校中较早倡导并开展创新创业教育的学校。自1984年以来,学校大力开展以突出创新创业实践为特色的创新创业教育。1995年,在全国率先成立以学生创新创业教育为主体的教学改革示范区创新教育实践中心,开展创新创业教育课程体系、教学内容、教学方法、教学模式等方面的改革,探索与之配套的管理运行机制,将创造性思维与创新方法融入教学实践中,在课堂教学中树立CDIO工程教育新理念,倡导做中学,在实践环节构建了个性化、双渠道、三结合、四层次、多模式的创新教育实践教学新体系,取得了一系列成果,在全国高校产生了很大的影响。创造性思维与创新方法和创新教育基础与实践(系列)课程分别被评为国家级精品资源开放课程。大学生程序设计竞赛初级教材是创新教育基础与实践系列课程的核心课程,是面向大连理工大学ACM创新实践班的学生开设的。
此外,本书在撰写过程中,除了参考文献和正文中标出的引用来源,还参考了国内外的相关研究成果和网站资源,但没有一一列出,在此感谢所涉及的所有单位、专家和研究人员。
因编者水平有限,书中的错误和不足之处在所难免,欢迎广大读者来信批评指正,提出宝贵意见,帮助我们不断地完善本书。
编 者
2018年12月
|
|