内容简介
《算法设计与分析(第2版)/高等学校数据结构课程系列教材》系统地介绍了各种常用的算法设计策略,包括递归、分治法、蛮力法、回溯法、分枝限界法、贪心法、动态规划、概率算法和近似算法等,并详细讨论了各种图算法和计算几何设计算法。
《算法设计与分析(第2版)/高等学校数据结构课程系列教材》既注重原理又注重实践,配有大量图表、练习题、上机实验题和在线编程题,内容丰富,概念讲解清楚,表达严谨,逻辑性强,语言精练,可读性好。
《算法设计与分析(第2版)/高等学校数据结构课程系列教材》既便于教师课堂讲授,又便于自学者阅读,适合作为高等院校“算法设计与分析”课程的教材,也可供ACM和各类程序设计竞赛者参考。目录
第1章概论/
1.1算法的概念/
1.1.1什么是算法/
1.1.2算法描述/
1.1.3算法和数据结构/
1.1.4算法设计的基本步骤/
1.2算法分析/
1.2.1算法时间复杂度分析/
1.2.2算法空间复杂度分析/
1.3算法设计工具——STL/
1.3.1STL概述/
1.3.2常用的STL容器/
1.3.3STL在算法设计中的应用/
1.4练习题/
1.5上机实验题/
1.6在线编程题/
第2章递归算法设计技术/
2.1什么是递归/
2.1.1递归的定义/
2.1.2何时使用递归/
2.1.3递归模型/
2.1.4递归算法的执行过程/
2.2递归算法设计/
2.2.1递归与数学归纳法/
2.2.2递归算法设计的一般步骤/
2.2.3递归数据结构及其递归算法设计/
2.2.4基于归纳思想的递归算法设计/
2.3递归算法设计示例/
2.3.1简单选择排序和冒泡排序/
2.3.2求解n皇后问题/
2.4*递归算法转化为非递归算法/
2.4.1用循环结构替代递归过程/
2.4.2用栈消除递归过程/
2.5递推式的计算/
2.5.1用特征方程求解递归方程/
2.5.2用递归树求解递归方程/
2.5.3用主方法求解递归方程/
2.6练习题/
2.7上机实验题/
2.8在线编程题/
第3章分治法/
3.1分治法概述/
3.1.1分治法的设计思想/
3.1.2分治法的求解过程/
3.2求解排序问题/
3.2.1快速排序/
3.2.2归并排序/
3.3求解查找问题/
3.3.1查找最大和次大元素/
3.3.2折半查找/
3.3.3寻找一个序列中第k小的元素/
3.3.4寻找两个等长有序序列的中位数/
3.4求解组合问题/
3.4.1求解最大连续子序列和问题/
3.4.2求解棋盘覆盖问题/
3.4.3求解循环日程安排问题/
3.5求解大整数乘法和矩阵乘法问题/
3.5.1求解大整数乘法问题/
3.5.2求解矩阵乘法问题/
3.6并行计算简介/
3.6.1并行计算概述/
3.6.2并行计算模型/
3.6.3快速排序的并行算法/
3.7练习题/
3.8上机实验题/
3.9在线编程题/
第4章蛮力法/
4.1蛮力法概述/
4.2蛮力法的基本应用/
4.2.1采用直接穷举思路的一般格式/
4.2.2简单选择排序和冒泡排序/
4.2.3字符串匹配/
4.2.4求解最大连续子序列和问题/
4.2.5求解幂集问题/
4.2.6求解简单0/1背包问题/
4.2.7求解全排列问题/
4.2.8求解任务分配问题/
4.3递归在蛮力法中的应用/
4.3.1用递归方法求解幂集问题/
4.3.2用递归方法求解全排列问题/
4.3.3用递归方法求解组合问题/
4.4图的深度优先和广度优先遍历/
4.4.1图的存储结构/
4.4.2深度优先遍历/
4.4.3广度优先遍历/
4.4.4求解迷宫问题/
4.5练习题/
4.6上机实验题/
4.7在线编程题/
第5章回溯法/
5.1回溯法概述/
5.1.1问题的解空间/
5.1.2什么是回溯法/
5.1.3回溯法的算法框架及其应用/
5.1.4回溯法与深度优先遍历的异同/
5.1.5回溯法的时间分析/
5.2求解0/1背包问题/
5.3求解装载问题/
5.3.1求解简单装载问题/
5.3.2求解复杂装载问题/
5.4求解子集和问题/
5.4.1求子集和问题的解/
5.4.2判断子集和问题是否存在解/
5.5求解n皇后问题/
5.6求解图的m着色问题/
5.7求解任务分配问题/
5.8求解活动安排问题/
5.9求解流水作业调度问题/
5.10练习题/
5.11上机实验题/
5.12在线编程题/
第6章分枝限界法/
6.1分枝限界法概述/
6.1.1什么是分枝限界法/
6.1.2分枝限界法的设计思想/
6.1.3分枝限界法的时间性能/
6.2求解0/1背包问题/
6.2.1采用队列式分枝限界法求解/
6.2.2采用优先队列式分枝限界法求解/
6.3求解图的单源最短路径/
6.3.1采用队列式分枝限界法求解/
6.3.2采用优先队列式分枝限界法求解/
6.4求解任务分配问题/
6.5求解流水作业调度问题/
6.6练习题/
6.7上机实验题/
6.8在线编程题/
第7章贪心法/
7.1贪心法概述/
7.1.1什么是贪心法/
7.1.2用贪心法求解的问题应具有的性质/
7.1.3贪心法的一般求解过程/
7.2求解活动安排问题/
7.3求解背包问题/
7.4求解最优装载问题/
7.5求解田忌赛马问题/
7.6求解多机调度问题/
7.7哈夫曼编码/
7.8求解流水作业调度问题/
7.9练习题/
7.10上机实验题/
7.11在线编程题/
第8章动态规划/
8.1动态规划概述/
8.1.1从求解斐波那契数列看动态规划法/
8.1.2动态规划的原理/
8.1.3动态规划求解的基本步骤/
8.1.4动态规划与其他方法的比较/
8.2求解整数拆分问题/
8.3求解最大连续子序列和问题/
8.4求解三角形最小路径问题/
8.5求解最长公共子序列问题/
8.6求解最长递增子序列问题/
8.7求解编辑距离问题/
8.8求解0/1背包问题/
8.9求解完全背包问题/
8.10求解资源分配问题/
8.11求解会议安排问题/
8.12滚动数组/
8.12.1什么是滚动数组/
8.12.2用滚动数组求解0/1背包问题/
8.13练习题/
8.14上机实验题/
8.15在线编程题/
第9章图算法设计/
9.1求图的最小生成树/
9.1.1最小生成树的概念/
9.1.2用普里姆算法构造最小生成树/
9.1.3克鲁斯卡尔算法/
9.2求图的最短路径/
9.2.1狄克斯特拉算法/
9.2.2贝尔曼福特算法/
9.2.3SPFA算法/
9.2.4弗洛伊德算法/
9.3求解旅行商问题/
9.3.1旅行商问题描述/
9.3.2采用蛮力法求解TSP问题/
9.3.3采用动态规划求解TSP问题/
9.3.4采用回溯法求解TSP问题/
9.3.5采用分枝限界法求解TSP问题/
9.3.6采用贪心法求解TSP问题/
9.4网络流/
9.4.1相关概念/
9.4.2求最大流/
9.4.3割集与割量/
9.4.4求最小费用最大流/
9.5练习题/
9.6上机实验题/
9.7在线编程题/
第10章计算几何/
10.1向量运算/
10.1.1向量的基本运算/
10.1.2判断一个点是否在一个矩形内/
10.1.3判断一个点是否在一条线段上/
10.1.4判断两条线段是否平行/
10.1.5判断两条线段是否相交/
10.1.6判断一个点是否在多边形内/
10.1.7求3个点构成的三角形的面积/
10.1.8求一个多边形的面积/
10.2求解凸包问题/
10.2.1礼品包裹算法/
10.2.2Graham扫描算法/
10.3求解最近点对问题/
10.3.1用蛮力法求最近点对/
10.3.2用分治法求最近点对/
10.4求解最远点对问题/
10.4.1用蛮力法求最远点对/
10.4.2用旋转卡壳法求最远点对/
10.5练习题/
10.6上机实验题/
10.7在线编程题/
第11章计算复杂性理论简介/
11.1计算模型/
11.1.1求解问题的分类/
11.1.2图灵机模型/
11.2P类和NP类问题/
11.3NPC问题/
11.4练习题/
第12章概率算法和近似算法/
12.1概率算法/
12.1.1什么是概率算法/
12.1.2蒙特卡罗类型概率算法/
12.1.3拉斯维加斯类型概率算法/
12.1.4舍伍德类型概率算法/
12.2近似算法/
12.2.1什么是近似算法/
12.2.2求解旅行商问题的近似算法/
12.3练习题/
12.4上机实验题/
12.5在线编程题/
附录A书中部分算法清单/
参考文献/
前言/序言
前言
算法在计算科学中扮演着重要角色。算法设计是计算机科学与技术专业的必修课,其目标是培养学生分析问题和解决问题的能力,使学生掌握算法设计的基本技巧和方法,熟悉算法分析的基本技术,并能熟练运用一些常用算法策略解决一些较综合的问题。
在学习《算法设计与分析(第2版)/高等学校数据结构课程系列教材》之前,学生已经学习了基本的数据结构知识,能熟练运用一门或多门编程语言,并具备了一定的编程经验。如何利用已学过的知识针对不同的实际问题设计出有效的算法,是《算法设计与分析(第2版)/高等学校数据结构课程系列教材》所要达到的目的。
《算法设计与分析(第2版)/高等学校数据结构课程系列教材》的特点是“问题模型化,求解算法化,设计最优化”,在掌握必要的算法设计技术和编程技巧的基础上,能够在实际工作中根据具体问题设计和优化算法。《算法设计与分析(第2版)/高等学校数据结构课程系列教材》是针对这一特点并结合课程组全体教师多年的教学经验编写的。
1.《算法设计与分析(第2版)/高等学校数据结构课程系列教材》内容
《算法设计与分析(第2版)/高等学校数据结构课程系列教材》由12章构成,各章的内容如下。
第1章概论:介绍算法的概念、算法分析方法和STL在算法设计中的应用。
第2章递归算法设计技术:介绍递归的概念、递归算法设计方法和相关示例、递归算法到非递归算法的转化以及递推式的计算。
第3章分治法:介绍分治法的策略和求解过程,讨论采用分治法求解排序问题、查找问题、最大连续子序列和问题、大整数乘法问题及矩阵乘法问题的典型算法,并简要介绍了并行计算的概念。
第4章蛮力法:介绍蛮力法的特点、蛮力法的基本应用示例、递归在蛮力法中的应用以及图的深度优先和广度优先遍历算法。
第5章回溯法:介绍解空间概念和回溯法算法框架,讨论采用回溯法求解0/1背包问题、装载问题、子集和问题、n皇后问题、图的m着色问题、任务分配问题、活动安排问题和流水作业调度问题的典型算法。
第6章分枝限界法:介绍分枝限界法的特点和算法框架、队列式分枝限界法和优先队列式分枝限界法,讨论采用分枝限界法求解0/1背包问题、图的单源最短路径、任务分配问题和流水作业调度问题的典型算法。
第7章贪心法:介绍贪心法的策略、求解过程和贪心法求解问题应具有的性质,讨论采用贪心法求解活动安排问题、背包问题、最优装载问题、田忌赛马问题、多机调度问题、哈夫曼编码和流水作业调度问题的典型算法。
第8章动态规划:介绍动态规划的原理和求解步骤,讨论采用动态规划法求解整数拆分问题、最大连续子序列和问题、三角形最小路径问题、最长公共子序列问题、最长递增子序列问题、编辑距离问题、0/1背包问题、完全背包问题、资源分配问题、会议安排问题和滚动数组的典型算法。
第9章图算法设计:讨论构造图最小生成树的两种算法(Prim和Kruskal算法,并查集的应用)、求图的最短路径的4种算法(Dijkstra、BellmanFord、SPFA和Floyd),并采用5种算法策略求解旅行商问题(TSP问题),最后介绍网络流的相关概念以及求最大流和最小费用最大流的算法。
第10章计算几何:介绍计算几何中常用的矢量运算以及求解凸包问题、最近点对问题和最远点对问题的典型算法。
第11章计算复杂性理论简介:介绍图灵机计算模型、P类和NP类问题以及NPC问题。
第12章概率算法和近似算法:介绍这两类算法的特点和基本的算法设计方法。
书中带“*”符号的章节作为选学内容。
2.《算法设计与分析(第2版)/高等学校数据结构课程系列教材》特色
《算法设计与分析(第2版)/高等学校数据结构课程系列教材》具有如下鲜明特色。
(1)由浅入深,循序渐进:每种算法策略从设计思想、算法框架入手,由易到难地讲解经典问题的求解过程,使读者既能学到求解问题的方法,又能通过对算法策略的反复应用掌握其核心原理,以收到融会贯通之效。
(2)示例丰富,重视启发:书中列举大量的具有典型性的求解问题,深入剖析采用相关算法策略求解的思路,展示算法设计的清晰过程,并举一反三,激发学生学习算法设计的兴趣。
(3)注重求解问题的多维性:同一个问题采用多种算法策略实现,如0/1背包问题采用回溯法、分枝限界法和动态规划求解,旅行商问题采用5种算法策略求解。通过不同算法策略的比较,使学生更容易体会到每一种算法策略的设计特点和各自的优/缺点,以提高算法设计的效率。
(4)强调实验和动手能力的培养:算法讲解不仅包含思路描述,而且以C/C++完整程序的形式呈现,同时给出了大量的上机实验题和在线编程题,大部分是近几年国内外的著名IT企业面试笔试题(谷歌、微软、阿里巴巴、腾讯、网易等)和ACM竞赛题。通过这些题目的训练,不仅可以提高学生的编程能力,而且可以帮助其直面求职市场。
(5)《算法设计与分析(第2版)/高等学校数据结构课程系列教材》配套有《算法设计与分析(第2版)学习与实验指导》(李春葆,清华大学出版社,2018),涵盖所有练习题、上机实验题和在线编程题的参考答案。
(6)《算法设计与分析(第2版)/高等学校数据结构课程系列教材》配套有绝大部分知识点的教学视频,视频采用微课碎片化形式组织(含100多个小视频,累计超过20小时),读者通过扫描二维码即可观看相关视频讲解。
3.教学资源
《算法设计与分析(第2版)/高等学校数据结构课程系列教材》提供的教学资源包括完整的教学PPT和书中全部源程序代码(在VC++6.0中调试通过),用户可以扫描封底课件二维码免费下载。
4.感谢
《算法设计与分析(第2版)/高等学校数据结构课程系列教材》的编写得到湖北省教育厅和武汉大学教学研究项目《计算机科学与技术专业课程体系改革》的大力帮助,清华大学出版社的魏江江主任全力支持《算法设计与分析(第2版)/高等学校数据结构课程系列教材》的编写工作,王冰飞老师给予精心的编辑工作。
《算法设计与分析(第2版)/高等学校数据结构课程系列教材》在编写过程中参考了很多同行的教材和网络博客,特别是“牛客网”中众多的企业面试、笔试题和丰富资源给予编者良好的启发,河南工程学院张天伍老师和使用本教材第1版的多位老师指正多处问题和错误,在此一并表示衷心感谢。
《算法设计与分析(第2版)/高等学校数据结构课程系列教材》是课程组全体教师多年教学经验的总结和体现,尽管编者不遗余力,但由于水平所限,难免存在不足之处,敬请教师和同学们批评指正,在此表示衷心感谢。
编者
2018年5月