本书共分11章,第1章介绍Linux操作系统与C++编程环境,第2章简单介绍初级算法,第3章介绍基础数据结构,第4章介绍枚举、递推、递归、贪心、分治、哈希和二分等基础算法设计,第5章介绍简单排序算法,第6章介绍图论的相关知识,第7章介绍并查集和线段树两种高级数据结构,第8章介绍KMP、字典树、Z算法和马拉车算法等处理字符串的数据结构,第9章介绍深度优先搜索、宽度优先搜索、双向宽度优先搜索、A*搜索和一些剪枝常用的策略,第10章介绍初等数论,第11章介绍动态规划,重点讲述背包问题。
这是一本关于算法的教材。算法是一系列解决问题的清晰指令,可以说是程序设计的灵魂。同一问题可用不同算法解决,而一个算法的质量优劣将影响程序的执行效率。算法分析的目的在于选择合适算法和改进算法。评价一个算法的好坏主要是通过算法运行的时间长短和占用空间的大小来考虑。对于计算机相关专业的学生或者爱好计算机的学生来说,无论是学习还是工作,或多或少都会应用到一些算法的知识。而目前国内外大型互联网公司招聘时的笔试和面试都以算法为主,可见算法的重要性是不言而喻的。ACMICPC(ACM International Collegiate Programming Contest,ACM国际大学生程序设计竞赛)是一项由美国计算机协会主办的旨在展示大学生创新能力、团队精神,以及在压力下编写程序、分析和解决问题能力的年度竞赛。ACM程序设计竞赛的题目强调算法的高效性与正确性。参赛选手只有编写出能够在规定时间内运行完成若干组严格的测试数据且结果全部正确的程序,才能得到分数。本教程将以ACM程序设计竞赛的题目为基础,介绍一些比较初级的算法。
本书是面向初学者的一本算法教材。即使是从未接触过算法,甚至还没有接触过编程语言,都可以将本书当作算法入门的读物。本书旨在将更多对计算机和算法感兴趣,但又苦于无从入手的同学带进算法的大门。本书依次介绍了一些包括排序算法在内的、基础的数据结构和算法设计。相信当读者掌握了这些内容之后,会对算法和程序设计有一个新层次的认识并产生浓厚的兴趣;之后重点介绍并查集、线段树和一些字符串处理方面的高级数据结构,还将介绍搜索、图论、动态规划和数论等程序设计竞赛中常用到的算法。对于每个算法,本书都有图文并茂的翔实讲解;每章节的后面都有针对该节知识点的例题讲解,每道例题都是国内外著名程序在线判题系统中的原题,而且对每道例题,都会从理解题意开始,详细讲解解题的思路,并附有完整的可以正确通过测试样例的代码,供读者研究学习。除了例题,每一章的最后还有一些练习题供读者巩固本节中学到的知识,如果读者对这些习题仍感觉无从下手,可以参考每道练习题后附带的思路分析来帮助整理解题思路。
本书共分11章,第1章介绍Linux操作系统与C++编程环境;第2章简单介绍初级算法;第3章介绍基础数据结构;第4章介绍枚举、递推、递归、贪心、分治、哈希和二分等基础算法设计;第5章介绍简单排序算法;第6章介绍图论的相关知识,包括最短路径问题和最小生成树问题的一些经典算法;第7章介绍并查集和线段树两种高级数据结构;第8章介绍KMP、字典树、Z算法和马拉车算法等处理字符串的数据结构;第9章介绍搜索的相关算法,包括深度优先搜索、宽度优先搜索、双向宽度优先搜索、A*搜索和一些剪枝常用的策略;第10章介绍初等数论;第11章介绍动态规划,重点介绍背包问题。本书的例题代码都是集训队成员测试提交通过的正确代码。
梁冰,工程师,博士,大连理工大学创新创业学院教师,主要从事创新创业教育、数据融合、数据挖掘等教学和科学研究工作。自2012年起担任大连理工大学国际大学生程序设计竞赛教练。
第1章 Linux操作系统与编程环境
1.1 Linux基础
1.2 编译器
1.2.1 Code::Blocks安装
1.2.2 Code::Blocks编程环境配置
1.2.3 Code::Blocks编写程序
1.3 编译C++文件
1.4 ACM国际大学生程序设计竞赛
1.5 自动评测系统
1.5.1 评测系统反馈
1.5.2 国内知名评测系统
第2章 算法入门
2.1 快速幂取模算法
2.1.1 模运算
2.1.2 幂取模的计算
2.1.3 例题讲解
2.2 算法
2.2.1 算法的定义
2.2.2 学习算法的意义
2.2.3 算法复杂度分析
第3章 基本数据结构
3.1 基本线性数据结构
3.1.1 线性表
3.1.2 栈
3.1.3 队列
3.1.4 例题讲解
3.2 二叉搜索树
3,2.1 二叉搜索树的定义
3.2.2 二叉搜索树的实现
3.3 CH标准模板库
3.3.1 VeCtOr
3.3.2 Set
3.3.3 map
3.3.4 priority_queue
3.3.5 例题讲解
3.4 练习题
第4章 基本算法设计
4.1 枚举
4.1.1 枚举算法的定义
4.1.2 枚举算法的解题过程
4.1.3 枚举算法的特点
4.1.4 例题讲解
4.2 递推
4.2.1 递推的概念
4.2.2 递推与数列
4.2.3 斐波那契数列
4.2.4 递推的两种顺序
4.2.5 例题讲解
4.3 递归
4.3.1 递归的定义
4.3.2 递归的要求
4.3.3 递归与递推
4.3.4 例题讲解
4.4 贪心算法
4.4.1 贪心算法的概念
4.4.2 贪心算法的原理
4.4.3 例题讲解
4.5 分治算法
4.5.1 分治的基本思想
4.5.2 分治的一般解题步骤
4.5.3 分治的特点
4.5.4 归并排序
4.5.5 例题讲解
4.6 模拟
4.6.1 高精度计算
4.6.2 矩阵运算
4.6.3 例题讲解
4.7 哈希
4.7.1 直接寻址表
4.7.2 哈希表
4.7.3 例题讲解
4.8 二分法
4.8.1 二分查找
4.8.2 二分逼近
4.8.3 求解性问题的二分策略
4.8.4 例题讲解
4.9 练习题
第5章 排序算法
5.1 基于比较的排序算法
5.1.1 简单排序
5.1.2 快速排序
5.1.3 限制和优势
5.2 基于统计的排序算法
5.2.1 计数排序
5.2.2 基数排序
5.3 例题讲解
5.4 练习题
第6章 图的基本算法
6.1 图的定义及存储方法
6.1.1 图的定义
6.1.2 有向图和无向图
6.1.3 路径与连通
6.1.4 图的存储结构
6.2 图的遍历及拓扑排序
6.2.1 图的深度优先遍历
6.2.2 图的宽度优先遍历
6.2.3 图的拓扑排序
6.2.4 例题讲解
6.3 最小生成树
6.3.1 Kruskal算法
6.3.2 Prim算法
6.4 单源最短路径
6.4.1 Dijkstra算法
6.4.2 Bellman-Ford算法
6.4.3 SPFA算法
6.4.4 差分约束系统
6.4.5 例题讲解
6.5 每对顶点的最短路径
6.5.1 最短路径和矩阵乘法
6.5.2 Floyd算法
6.5.3 例题讲解
6.6 练习题
第7章 并查集和线段树
7.1 并查集
7.1.1 并查集的基本概念
7.1.2 并查集的操作
7.1.3 例题讲解
7.2 线段树
7.2.1 线段树的概念与性质
7.2.2 线段树的基本操作
7.2.3 例题讲解
7.3 练习题
第8章 字符串问题
8.1 Trie树
8.1.1 Trie树的基本概念
8.1.2 Trie树的操作
8.1.3 例题讲解
8.2 KMP算法
……
第9章 搜索
第10章 初等数论
第11章 动态规划入门
参考文献