目 录 卷I 实用算法设计 第1章 算法设计简论 3 1.1 机器人巡游最优化 4 1.2 合理挑选工作 8 1.3 关于正确性的推理 11 1.3.1 问题和特性 11 1.3.2 表述算法 12 1.3.3 论证非正确性 13 1.4 归纳与递归 14 1.5 建立问题的模型 16 1.5.1 组合式对象 17 1.5.2 递归式对象 18 1.6 反证法 20 1.7 关于“算法征战逸事” 20 1.8 算法征战逸事: 通灵者的模型建立 21 1.9 估算 24 1.10 习题 25 第2章 算法分析 30 2.1 RAM计算模型 30 2.2 大O记号 32 2.3 增长量级与强弱关系 35 2.4 以大O来推演公式 37 2.4.1 函数相加 38 2.4.2 函数相乘 38 2.5 关于效率的推理 39 2.5.1 选择排序 39 2.5.2 插入排序 40 2.5.3 字符串模式匹配 41 2.5.4 矩阵乘法 43 2.6 求和 44 2.7 对数及其应用 46 2.7.1 对数与二分查找 46 2.7.2 对数与树 46 2.7.3 对数与比特 46 2.7.4 对数与乘法 47 2.7.5 快速求幂 47 2.7.6 对数与求和 48 2.7.7 对数与司法正义 48 2.8 对数的特性 50 2.9 算法征战逸事: 锥体之秘 51 2.10 高等分析(*) 53 2.10.1 一些深奥难懂的函数 54 2.10.2 极限与强弱关系 55 2.11 习题 56 第3章 数据结构. 65 3.1 紧接数据结构与链接数据结构 65 3.1.1 数组. 66 3.1.2 指针与链接结构 67 3.1.3 对比. 69 3.2 容器: 栈与队列. 70 3.3 字典 71 3.4 二叉查找树 75 3.4.1 实现二叉查找树 76 3.4.2 二叉查找树究竟能有多好. 80 3.4.3 平衡查找树 80 3.5 优先级队列 82 3.6 算法征战逸事: 剥离三角剖分 84 3.7 散列 87 3.7.1 碰撞消除 87 3.7.2 凭借散列实现副本检测. 89 3.7.3 其他散列技巧. 91 3.7.4 规范化 91 3.7.5 精简. 91 3.8 专用数据结构 92 3.9 算法征战逸事: 把它们串起来 93 3.10 习题 96 第4章 排序 103 4.1 排序的应用 103 4.2 排序的范式 107 4.3 堆排序: 借助数据结构而得的最优排序. 108 4.3.1 堆 109 4.3.2 建堆. 111 4.3.3 取最小元 112 4.3.4 更快的建堆算法(*) 114 4.3.5 利用增量式插入来排序. 116 4.4 算法征战逸事: 给我一张机票 117 4.5 归并排序: 通过分治来排序 119 4.6 快速排序: 通过随机化来排序 122 4.6.1 快速排序期望情况的直观解释 124 4.6.2 随机化算法. 125 4.6.3 快速排序真的快吗 127 4.7 分配排序: 通过装桶来排序 127 4.8 算法征战逸事: 为被告辩护的Skiena 129 4.9 习题 131 第5章 分治 138 5.1 二分查找及相关算法 138 5.1.1 出现次数的计数 139 5.1.2 单侧二分查找. 140 5.1.3 平方根和其他方根 140 5.2 算法征战逸事: 错中揪错. 141 5.3 递推关系 142 5.4 求解分治递推关系 144 5.5 快速乘法 145 5.6 最大子范围与最近点对 . 146 5.7 并行算法 148 5.7.1 数据并行化. 149 5.7.2 并行化的陷阱. 149 5.8 算法征战逸事: 毫无进展. 150 5.9 卷积(*). 151 5.9.1 卷积的应用. 152 5.9.2 快速多项式乘法(**) . 153 5.10 习题 155 第6章 散列与随机化算法 158 6.1 重温概率论 159 6.1.1 概率. 159 6.1.2 复合事件与独立性 160 6.1.3 条件概率 161 6.1.4 概率分布 162 6.1.5 均值与方差. 163 6.1.6 投掷硬币 163 6.2 理解球与箱 165 6.3 为什么散列是随机化算法. 167 6.4 Bloom过滤器 168 6.5 生日悖论和完美散列 170 6.6 取小式散列 172 6.7 高效字符串匹配. 174 6.8 素性检验 176 6.9 算法征战逸事: 将我的中间名首字母告诉Knuth 177 6.10 随机数从何而来 178 6.11 习题 179 第7章 图的遍历 182 7.1 图的风格 183 7.2 用于图的数据结构 187 7.3 算法征战逸事: 我曾是摩尔定律的受害者 191 7.4 算法征战逸事: 图的获取. 194 7.5 遍历图 196 7.6 广度优先搜索 196 7.6.1 实现. 198 7.6.2 发掘遍历的功用 199 7.6.3 寻找路径 199 7.7 广度优先搜索的应用 200 7.7.1 连通分量 200 7.7.2 双色图 201 7.8 深度优先搜索 202 7.9 深度优先搜索的应用 205 7.9.1 寻找环 206 7.9.2 关节点 206 7.10 有向图的深度优先搜索. 210 7.10.1 拓扑排序 211 7.10.2 强连通分量. 212 7.11 习题 215 第8章 加权图算法 222 8.1 最小生成树 222 8.1.1 Prim算法 223 8.1.2 Kruskal算法. 226 8.1.3 合并—查找数据结构 228 8.1.4 最小生成树的变种 230 8.2 算法征战逸事: 网络之外别无他求. 231 8.3 最短路径 234 8.3.1 Dijkstra算法. 234 8.3.2 全图点对最短路径 237 8.3.3 传递闭包 239 8.4 算法征战逸事: 拨出文档. 239 8.5 网络流和二部匹配 243 8.5.1 二部匹配 243 8.5.2 计算网络流. 244 8.6 随机化最小割 247 8.7 去设计图, 而非算法 248 8.8 习题 251 第9章 组合搜索 255 9.1 回溯 255 9.2 回溯实例 258 9.2.1 构建全部子集. 258 9.2.2 构建全部置换. 259 9.2.3 构建图的全部路径 260 9.3 搜索剪枝法 262 9.4 数独 263 9.5 算法征战逸事: 覆盖棋盘. 267 9.6 最佳优先搜索 271 9.7 A.启发式方法. 272 9.8 习题 274 第10章 动态规划 279 10.1 缓存与计算 280 10.1.1 以递归计算Fibonacci数 280 10.1.2 以缓存计算Fibonacci数 281 10.1.3 以动态规划计算Fibonacci数 283 10.1.4 二项式系数. 283 10.2 字符串近似匹配 285 10.2.1 以递归计算编辑距离 .286 10.2.2 以动态规划求解编辑距离 287 10.2.3 重建路径 289 10.2.4 编辑距离的变种 291 10.3 最长递增子序列 293 10.4 算法征战逸事: 条码的文本压缩. 295 10.5 无次序划分/子集和值 . 298 10.6 算法征战逸事: 功率平衡 .300 10.7 依次序划分问题 302 10.8 上下文无关语言的语法分析 305 10.9 动态规划的局限性: TSP. 307 10.9.1 动态规划算法什么时候是正确的?. 308 10.9.2 动态规划算法什么时候是高效的?. 309 10.10 算法征战逸事: 过去所发生的事就是Prolog 310 10.11 习题 313 第11章 NP完全 321 11.1 问题和归约 321 11.1.1 关键思想 322 11.1.2 判定问题 323 11.2 算法的归约 323 11.2.1 最近点对 324 11.2.2 最长递增子序列 324 11.2.3 最小公倍数. 325 11.2.4 凸包(*) 326 11.3 基础性的难解性归约 327 11.3.1 哈密顿环 328 11.3.2 独立集和顶点覆盖 329 11.3.3 团 332 11.4 可满足性 333 11.5 创造性的归约 335 11.5.1 顶点覆盖 335 11.5.2 整数规划 337 11.6 难解性证明的艺术 339 11.7 算法征战逸事: 争分夺秒亦难. 340 11.8 算法征战逸事: 后来我失败了 .343 11.9 P与NP 345 11.9.1 验证与发现 .345 11.9.2 P类和NP类. 345 11.9.3 可满足性问题为何如此之难 346 11.9.4 是NP难解还是NP完全? 346 11.10 习题 348 第12章 处理难解问题 354 12.1 近似算法 354 12.2 顶点覆盖问题的近似算法 355 12.3 欧氏空间旅行商问题 357 12.4 何时平均已经够好 360 12.4.1 最大化k-SAT 360 12.4.2 最大无环子图 361 12.5 集合覆盖 361 12.6 启发式搜索方法 363 12.6.1 随机抽样 364 12.6.2 局部搜索 366 12.6.3 模拟退火 368 12.6.4 模拟退火的应用 372 12.7 算法征战逸事: 只不过它不是收音机而已 .373 12.8 算法征战逸事: 对阵列退火 376 12.9 遗传算法与其他启发式搜索方法 .379 12.10 量子计算 380 12.10.1 “Quantum”计算机的特性 .380 12.10.2 Grover数据库搜索算法 382 12.10.3 更快的“Fourier”变换 383 12.10.4 整数因子分解的Shor算法 384 12.10.5 展望量子计算 385 12.11 习题 387 第13章 如何设计算法 390 卷II 算法世界搭车客指南 第14章 算法问题目录册 397 第15章 数据结构 399 15.1 字典 399 15.2 优先级队列 404 15.3 后缀树和后缀数组 407 15.4 图数据结构 410 15.5 集合数据结构 413 15.6 k维树. 416 第16章 数值问题 420 16.1 解线性方程组 421 16.2 带宽约减 424 16.3 矩阵乘法 426 16.4 行列式与积和式 428 16.5 约束最优化与无约束最优化 430 16.6 线性规划 434 16.7 随机数生成 437 16.8 因子分解与素性检验 440 16.9 精确算术 443 16.10 背包问题 446 16.11 离散傅里叶变换 449 第17章 组合问题 453 17.1 排序 453 17.2 查找 457 17.3 中位数和选择 461 17.4 生成置换 463 17.5 生成子集 467 17.6 生成划分 469 17.7 图的生成 473 17.8 日历计算 477 17.9 作业调度 478 17.10 可满足性 481 第18章 图问题: 多项式时间. 484 18.1 连通分量 484 18.2 拓扑排序 487 18.3 最小生成树 489 18.4 最短路径 494 18.5 传递闭包与传递约简 498 18.6 匹配 500 18.7 欧拉环/中国邮递员 503 18.8 边连通度与顶点连通度 .506 18.9 网络流 508 18.10 精致绘图 511 18.11 绘树 514 18.12 平面性检验与嵌入 516 第19章 图问题: NP难解 520 19.1 团 520 19.2 独立集 523 19.3 顶点覆盖 525 19.4 旅行商问题 527 19.5 哈密顿环 530 19.6 图划分 533 19.7 顶点着色 535 19.8 边着色 539 19.9 图同构 540 19.10 Steiner树 544 19.11 反馈边集/反馈顶点集 .547 第20章 计算几何 551 20.1 稳健的几何基元操作 551 20.2 凸包 555 20.3 三角剖分 558 20.4 Voronoi图 561 20.5 最近邻搜索 563 20.6 范围搜索 566 20.7 点定位 569 20.8 相交检测 571 20.9 装箱问题 574 20.10 中轴变换 577 20.11 多边形划分 579 20.12 简化多边形 582 20.13 形状相似度 584 20.14 运动规划 587 20.15 直线排布维护 .590 20.16 Minkowski和 .592 第21章 集合与字符串问题 595 21.1 集合覆盖 595 21.2 组集 598 21.3 字符串匹配 600 21.4 字符串近似匹配 603 21.5 文本压缩 607 21.6 密码学 610 21.7 有限状态机最小化 613 21.8 最长公共子串/最长公共子序列 616 21.9 最短公共超串 618 第22章 算法相关资源 621 22.1 算法库 621 22.1.1 LEDA 621 22.1.2 CGAL 622 22.1.3 Boost图库 622 22.1.4 Netlib 622 22.1.5 ACM算法集萃 623 22.1.6 GitHub与SourceForge. 623 22.1.7 The Stanford GraphBase 623 22.1.8 Combinatorica 624 22.1.9 源自书籍的程序 624 22.2 数据源 625 22.3 在线文献资源 626 22.4 专业咨询服务 626 参考文献 627