第1章 算法基础 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.1 函数增长 7
1.3 算法的运行时间 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.1 分治法的基本思想 20
2.2 分治法 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 线性时间选择 38
2.3.7 最近点对问题 42
习题 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.1 背包问题 98
第4章 贪心法 98
4.2 活动选择问题 101
4.3 贪心算法的基本元素 105
4.4 哈夫曼编码 107
4.5 最小生成树算法 113
4.5.1 最小生成树的基本原理 114
4.5.2 Kruskal算法 117
4.5.3 Prim算法 121
4.5.4 Boruvka算法 125
4.6 Dijkstra单源点最短路径算法 127
4.5.5 比较与改进 127
4.7 贪心算法的理论基础 133
4.8 作业调度问题 136
习题 138
第5章 回溯法 144
5.1 回溯法的基本原理 144
5.2 n皇后问题 148
5.3 子集和数问题 151
5.4 0-1背包问题 154
5.5 着色问题 157
习题 160
第6章 分枝限界法 163
6.1 分枝限界法的基本思想 163
6.2 0-1背包问题 167
6.3 作业调度问题 175
习题 178
第7章 NP完全性 180
7.1 P类问题与NP类问题 180
7.1.1 复杂类P和复杂类NP 181
7.1.2 NP中的有趣问题 183
7.2.1 多项式时间归约和NP难度 185
7.2 NP完全性 185
7.2.2 Cook定理 186
7.3 典型的NP完全问题 187
7.3.1 CNF-3SAT问题和3SAT问题 189
7.3.2 顶点覆盖问题 191
7.3.3 团问题和集合覆盖问题 193
7.3.4 子集和数问题与背包问题 194
7.3.5 哈密尔顿回路问题和TSP问题 196
习题 199
索引 201
参考文献 206