第1章 概论 1
1.1 算法的概念 2
1.1.1 什么是算法 2
1.1.2 算法描述 4
1.1.3 算法和数据结构 5
1.1.4 算法设计的基本步骤 6
1.2 算法分析 6
1.2.1 算法时间复杂度分析 6
1.2.2 算法空间复杂度分析 13
1.3 算法设计工具——STL 15
1.3.1 STL概述 15
1.3.2 常用的STL容器 18
1.3.3 STL在算法设计中的应用 30
1.4 练习题 38
1.5 上机实验题 39
1.6 在线编程题 39
第2章 递归算法设计技术 43
2.1 什么是递归 44
2.1.1 递归的定义 44
2.1.2 何时使用递归 44
2.1.3 递归模型 46
2.1.4 递归算法的执行过程 47
2.2 递归算法设计 52
2.2.1 递归与数学归纳法 52
2.2.2 递归算法设计的一般步骤 53
2.2.3 递归数据结构及其递归算法设计 54
2.2.4 基于归纳思想的递归算法设计 60
2.3 递归算法设计示例 63
2.3.1 简单选择排序和冒泡排序 63
2.3.2 求解n皇后问题 66
2.4 递归算法转化为非递归算法 68
2.4.1 用循环结构替代递归过程 68
2.4.2 用栈消除递归过程 69
2.5 递推式的计算 74
2.5.1 用特征方程求解递归方程 74
2.5.2 用递归树求解递归方程 77
2.5.3 用主方法求解递归方程 78
2.6 练习题 78
2.7 上机实验题 80
2.8 在线编程题 81
第3章 分治法 83
3.1 分治法概述 84
3.1.1 分治法的设计思想 84
3.1.2 分治法的求解过程 84
3.2 求解排序问题 85
3.2.1 快速排序 86
3.2.2 归并排序 88
3.3 求解查找问题 91
3.3.1 查找最大和次大元素 91
3.3.2 折半查找 93
3.3.3 寻找一个序列中第k小的元素 94
3.3.4 寻找两个等长有序序列的中位数 96
3.4 求解组合问题 101
3.4.1 求解最大连续子序列和问题 101
3.4.2 求解棋盘覆盖问题 103
3.4.3 求解循环日程安排问题 106
3.5 求解大整数乘法和矩阵乘法问题 108
3.5.1 求解大整数乘法问题 108
3.5.2 求解矩阵乘法问题 111
3.6 并行计算简介 112
3.6.1 并行计算概述 112
3.6.2 并行计算模型 112
3.6.3 快速排序的并行算法 113
3.7 练习题 114
3.8 上机实验题 116
3.9 在线编程题 117
第4章 蛮力法 120
4.1 蛮力法概述 121
4.2 蛮力法的基本应用 122
4.2.1 采用直接穷举思路的一般格式 122
4.2.2 简单选择排序和冒泡排序 125
4.2.3 字符串匹配 128
4.2.4 求解最大连续子序列和问题 129
4.2.5 求解幂集问题 132
4.2.6 求解简单0/1背包问题 135
4.2.7 求解全排列问题 137
4.2.8 求解任务分配问题 139
4.3 递归在蛮力法中的应用 141
4.3.1 用递归方法求解幂集问题 141
4.3.2 用递归方法求解全排列问题 142
4.3.3 用递归方法求解组合问题 144
4.4 图的深度优先和广度优先遍历 146
4.4.1 图的存储结构 146
4.4.2 深度优先遍历 148
4.4.3 广度优先遍历 151
4.4.4 求解迷宫问题 154
4.5 练习题 158
4.6 上机实验题 160
4.7 在线编程题 160
第5章 回溯法 163
5.1 回溯法概述 164
5.1.1 问题的解空间 164
5.1.2 什么是回溯法 167
5.1.3 回溯法的算法框架及其应用 168
5.1.4 回溯法与深度优先遍历的异同 176
5.1.5 回溯法的时间分析 177
5.2 求解0/1背包问题 178
5.3 求解装载问题 182
5.3.1 求解简单装载问题 182
5.3.2 求解复杂装载问题 185
5.4 求解子集和问题 187
5.4.1 求子集和问题的解 187
5.4.2 判断子集和问题是否存在解 189
5.5 求解n皇后问题 191
5.6 求解图的m着色问题 193
5.7 求解任务分配问题 196
5.8 求解活动安排问题 198
5.9 求解流水作业调度问题 201
5.10 练习题 205
5.11 上机实验题 206
5.12 在线编程题 207
第6章 分枝限界法 211
6.1 分枝限界法概述 212
6.1.1 什么是分枝限界法 212
6.1.2 分枝限界法的设计思想 212
6.1.3 分枝限界法的时间性能 215
6.2 求解0/1背包问题 215
6.2.1 采用队列式分枝限界法求解 216
6.2.2 采用优先队列式分枝限界法求解 220
6.3 求解图的单源最短路径 223
6.3.1 采用队列式分枝限界法求解 223
6.3.2 采用优先队列式分枝限界法求解 228
6.4 求解任务分配问题 230
6.5 求解流水作业调度问题 234
6.6 练习题 238
6.7 上机实验题 239
6.8 在线编程题 240
第7章 贪心法 242
7.1 贪心法概述 243
7.1.1 什么是贪心法 243
7.1.2 用贪心法求解的问题应具有的性质 245
7.1.3 贪心法的一般求解过程 245
7.2 求解活动安排问题 246
7.3 求解背包问题 251
7.4 求解最优装载问题 256
7.5 求解田忌赛马问题 257
7.6 求解多机调度问题 260
7.7 哈夫曼编码 263
7.8 求解流水作业调度问题 272
7.9 练习题 275
7.10 上机实验题 277
7.11 在线编程题 278
第8章 动态规划 281
8.1 动态规划概述 282
8.1.1 从求解斐波那契数列看动态规划法 282
8.1.2 动态规划的原理 283
8.1.3 动态规划求解的基本步骤 289
8.1.4 动态规划与其他方法的比较 290
8.2 求解整数拆分问题 291
8.3 求解最大连续子序列和问题 293
8.4 求解三角形最小路径问题 296
8.5 求解最长公共子序列问题 299
8.6 求解最长递增子序列问题 303
8.7 求解编辑距离问题 304
8.8 求解0/1背包问题 307
8.9 求解完全背包问题 312
8.10 求解资源分配问题 314
8.11 求解会议安排问题 318
8.12 滚动数组 322
8.12.1 什么是滚动数组 322
8.12.2 用滚动数组求解0/1背包问题 323
8.13 练习题 325
8.14 上机实验题 327
8.15 在线编程题 328
第9章 图算法设计 334
9.1 求图的最小生成树 335
9.1.1 最小生成树的概念 335
9.1.2 用普里姆算法构造最小生成树 335
9.1.3 克鲁斯卡尔算法 337
9.2 求图的最短路径 342
9.2.1 狄克斯特拉算法 343
9.2.2 贝尔曼-福特算法 348
9.2.3 SPFA算法 351
9.2.4 弗洛伊德算法 354
9.3 求解旅行商问题 357
9.3.1 旅行商问题描述 357
9.3.2 采用蛮力法求解TSP问题 357
9.3.3 采用动态规划求解TSP问题 360
9.3.4 采用回溯法求解TSP问题 364
9.3.5 采用分枝限界法求解TSP问题 367
9.3.6 采用贪心法求解TSP问题 370
9.4 网络流 371
9.4.1 相关概念 371
9.4.2 求最大流 373
9.4.3 割集与割量 378
9.4.4 求最小费用最大流 379
9.5 练习题 388
9.6 上机实验题 389
9.7 在线编程题 389
第10章 计算几何 392
10.1 向量运算 393
10.1.1 向量的基本运算 394
10.1.2 判断一个点是否在一个矩形内 397
10.1.3 判断一个点是否在一条线段上 398
10.1.4 判断两条线段是否平行 398
10.1.5 判断两条线段是否相交 399
10.1.6 判断一个点是否在多边形内 400
10.1.7 求3个点构成的三角形的面积 401
10.1.8 求一个多边形的面积 401
10.2 求解凸包问题 402
10.2.1 礼品包裹算法 403
10.2.2 Graham扫描算法 405
10.3 求解最近点对问题 408
10.3.1 用蛮力法求最近点对 408
10.3.2 用分治法求最近点对 409
10.4 求解最远点对问题 412
10.4.1 用蛮力法求最远点对 413
10.4.2 用旋转卡壳法求最远点对 413
10.5 练习题 415
10.6 上机实验题 416
10.7 在线编程题 416
第11章 计算复杂性理论简介 418
11.1 计算模型 419
11.1.1 求解问题的分类 419
11.1.2 图灵机模型 419
11.2 P类和NP类问题 424
11.3 NPC问题 425
11.4 练习题 426
第12章 概率算法和近似算法 427
12.1 概率算法 428
12.1.1 什么是概率算法 428
12.1.2 蒙特卡罗类型概率算法 429
12.1.3 拉斯维加斯类型概率算法 431
12.1.4 舍伍德类型概率算法 433
12.2 近似算法 434
12.2.1 什么是近似算法 434
12.2.2 求解旅行商问题的近似算法 434
12.3 练习题 438
12.4 上机实验题 439
12.5 在线编程题 439
附录A 书中部分算法清单 440
参考文献 445