第1章 算法基础 1
1.1 算法 1
1.1.1 冒泡排序 1
1.1.2 循环不变式和冒泡排序算法的正确性 2
1.1.3 伪代码使用约定 3
1.2 算法分析 4
1.2.1 冒泡排序算法分析 5
1.2.2 最坏情况和平均情况分析 6
1.2.3 增长的数量级 6
1.3 算法的运行时间 7
1.3.1 函数增长 7
1.3.2 渐近表示 8
习题 10
第2章 分治法 13
2.1 递归与递归方程 13
2.1.1 递归的概念 13
2.1.2 替换方法 16
2.1.3 递归树方法 17
2.1.4 主方法 18
2.2 分治法 20
2.2.1 分治法的基本思想 20
2.2.2 二叉查找算法 21
2.3 分治法应用实例 24
2.3.1 找最大值与最小值 24
2.3.2 Strassen矩阵乘法 26
2.3.3 整数相乘 27
2.3.4 归并排序 28
2.3.5 快速排序 33
2.3.6 线性时间选择 37
2.3.7 最近点对问题 41
习题 44
第3章 动态规划 49
3.1 用表代替递归 49
3.2 0-1背包问题 52
3.3 矩阵链乘问题 54
3.4 动态规划的基本元素 60
3.5 备忘录方法 64
3.6 装配线调度问题 70
3.7 最长公共子序列 73
3.8 最优二分检索树 77
3.9 凸多边形最优三角剖分 84
习题 88
第4章 贪心法 98
4.1 背包问题 98
4.2 活动选择问题 101
4.3 贪心算法的基本元素 105
4.4 哈夫曼编码 107
4.5 最小生成树算法 113
4.5.1 最小生成树的基本原理 113
4.5.2 Kruskal算法 116
4.5.3 Prim算法 120
4.5.4 Boruvka算法 124
4.5.5 比较与改进 126
4.6 贪心算法的理论基础 126
4.7 作业调度问题 130
习题 131
第5章 回溯法 136
5.1 回溯法的基本原理 136
5.2 n皇后问题 140
5.3 子集和数问题 143
5.4 0-1背包问题 146
5.5 着色问题 149
习题 152
第6章 分枝限界法 155
6.1 分枝限界法的基本思想 155
6.2 0-1背包问题 159
6.3 作业调度问题 167
习题 170
第7章 图算法 172
7.1 图的表示 172
7.2 广度优先搜索 173
7.3 Dijkstra算法 175
7.4 Bellman-Ford算法 182
7.5 Floyd-Warshall算法 184
习题 185
第8章 NP完全性 189
8.1 P类问题和NP类问题 189
8.1.1 复杂类P和复杂类NP 190
8.1.2 NP中的有趣问题 192
8.2 NP完全性 194
8.2.1 多项式时间归约和NP难度 194
8.2.2 Cook定理 195
8.3 典型的NP完全问题 196
8.3.1 CNF-3SAT问题和3SAT问题 198
8.3.2 顶点覆盖问题 200
8.3.3 团问题和集合覆盖问题 202
8.3.4 子集和数问题与背包问题 203
8.3.5 哈密尔顿回路问题和TSP问题 205
习题 208
附录A 习题选解 211
附录B 索引 226
参考文献 231