算法导论

算法导论
内容简介
在有关算法的书中,有一些叙述非常严谨,但不够全面;另一些涉及了大量的题材,但又缺乏严谨性。《算法导论(原书第 3 版)/ 计算机科学丛书》将严谨性和全面性融为一体,深入讨论各类算法,并着力使这些算法的设计和分析能为各个层次的读者接受。全书各章自成体系,可以作为独立的学习单元;算法以英语和伪代码的形式描述,具备初步程序设计经验的人就能看懂;说明和解释力求浅显易懂,不失深度和数学严谨性。
《算法导论(原书第 3 版)/ 计算机科学丛书》全书选材经典、内容丰富、结构合理、逻辑清晰,对本科生的数据结构课程和研究生的算法课程都是非常实用的教材,在 IT 专业人员的职业生涯中,《算法导论(原书第 3 版)/ 计算机科学丛书》也是一本案头必备的参考书或工程实践手册。
第 3 版的主要变化:
- 新增了 van Emde Boas 树和多线程算法,并且将矩阵基础移至附录。
- 修订了递归式(现在称为“分治策略”)那一章的内容,更广泛地覆盖分治法。
- 移除两章很少讲授的内容:二项堆和排序网络。
- 修订了动态规划和贪心算法相关内容。
- 流网络相关材料现在基于边上的全部流。
- 由于关于矩阵基础和 Strassen 算法的材料移到了其他章,矩阵运算这一章的内容所占篇幅更小。
- 修改了对 Knuth-Morris-Pratt 字符串匹配算法的讨论。
- 新增 100 道练习和 28 道思考题,还更新并补充了参考文献。
作者简介
Thomas H. Cormen (托马斯·科尔曼),达特茅斯学院计算机科学系教授、系主任。目前的研究兴趣包括:算法工程、并行计算、具有高延迟的加速计算。他分别于 1993 年、1986 年获得麻省理工学院电子工程和计算机科学博士、硕士学位,师从 Charles E. Leiserson 教授。由于他在计算机教育领域的突出贡献,Cormen 教授荣获 2009 年 ACM 杰出教员奖。
Charles E. Leiserson(查尔斯·雷瑟尔森),麻省理工学院计算机科学与电气工程系教授,Margaret MacVicar Faculty Fellow。他目前主持 MIT 超级计算技术研究组,并是 MIT 计算机科学和人工智能实验室计算理论研究组的成员。他的研究兴趣集中在并行和分布式计算的理论原理,尤其是与工程现实相关的技术研究。Leiserson 教授拥有卡内基·梅隆大学计算机科学博士学位,还是 ACM、IEEE 和 SIAM 的会士。
Ronald L. Rivest (罗纳德·李维斯特),现任麻省理工学院电子工程和计算机科学系安德鲁与厄纳·维特尔比(Andrew and Erna Viterbi)教授。他是 MIT 计算机科学和人工智能实验室的成员,并领导着其中的信息安全和隐私中心。他 1977 年从斯坦福大学获得计算机博士学位,主要从事密码安全、计算机安全算法的研究。他和 Adi Shamir 和 Len Adleman 一起发明了 RSA 公钥算法,这个算法在信息安全中获得大的突破,这一成果也使他和 Shamir、Adleman 一起得到 2002 年 ACM 图灵奖。他现在担任国家密码学会的负责人。
Clifford Stein(克利福德·斯坦),哥伦比亚大学计算机科学系和工业工程与运筹学系教授,他还是工业工程与运筹学系的系主任。在加入哥伦比亚大学大学之前,他在达特茅斯学院计算机科学系任教 9 年。Stein 教授拥有 MIT 硕士和博士学位。他的研究兴趣包括:算法的设计与分析,组合优化、运筹学、网络算法、调度、算法工程和生物计算。
目录
- 出版者的话
- 译者序
- 前言
第一部分 基础知识
第 1 章 算法在计算中的作用
- 1.1 算法
- 1.2 作为一种技术的算法
- 思考题
- 本章注记
第 2 章 算法基础
- 2.1 插入排序
- 2.2 分析算法
- 2.3 设计算法
- 2.3.1 分治法
- 2.3.2 分析分治算法
- 思考题
- 本章注记
第 3 章 函数的增长
- 3.1 渐近记号
- 3.2 标准记号与常用函数
- 思考题
- 本章注记
第 4 章 分治策略
- 4.1 最大子数组问题
- 4.2 矩阵乘法的 Strassen 算法
- 4.3 用代入法求解递归式
- 4.4 用递归树方法求解递归式
- 4.5 用主方法求解递归式
- 4.6 证明主定理
- 4.6.1 对 b 的幂证明主定理
- 4.6.2 向下取整和向上取整
- 思考题
- 本章注记
第 5 章 概率分析和随机算法
- 5.1 雇用问题
- 5.2 指示器随机变量
- 5.3 随机算法
- 5.4 概率分析和指示器随机变量的进一步使用
- 5.4.1 生日悖论
- 5.4.2 球与箱子
- 5.4.3 特征序列
- 5.4.4 在线雇用问题
- 思考题
- 本章注记
第二部分 排序和顺序统计量
第 6 章 堆排序
- 6.1 堆
- 6.2 维护堆的性质
- 6.3 建堆
- 6.4 堆排序算法
- 6.5 优先队列
- 思考题
- 本章注记
第 7 章 快速排序
- 7.1 快速排序的描述
- 7.2 快速排序的性能
- 7.3 快速排序的随机化版本
- 7.4 快速排序分析
- 7.4.1 最坏情况分析
- 7.4.2 期望运行时间
- 思考题
- 本章注记
第 8 章 线性时间排序
- 8.1 排序算法的下界
- 8.2 计数排序
- 8.3 基数排序
- 8.4 桶排序
- 思考题
- 本章注记
第 9 章 中位数和顺序统计量
- 9.1 最小值和最大值
- 9.2 期望为线性时间的选择算法
- 9.3 最坏情况为线性时间的选择算法
- 思考题
- 本章注记
第三部分 数据结构
第 10 章 基本数据结构
- 10.1 栈和队列
- 10.2 链表
- 10.3 指针和对象的实现
- 10.4 有根树的表示
- 思考题
- 本章注记
第 11 章 散列表
- 11.1 直接寻址表
- 11.2 散列表
- 11.3 散列函数
- 11.3.1 除法散列法
- 11.3.2 乘法散列法
- 11.3.3 全域散列法
- 11.4 开放寻址法
- 11.5 完全散列
- 思考题
- 本章注记
第 12 章 二叉搜索树
- 12.1 什么是二叉搜索树
- 12.2 查询二叉搜索树
- 12.3 插入和删除
- 12.4 随机构建二叉搜索树
- 思考题
- 本章注记
第 13 章 红黑树
- 13.1 红黑树的性质
- 13.2 旋转
- 13.3 插入
- 13.4 删除
- 思考题
- 本章注记
第 14 章 数据结构的扩张
- 14.1 动态顺序统计
- 14.2 如何扩张数据结构
- 14.3 区间树
- 思考题
- 本章注记
第四部分 高级设计和分析技术
第 15 章 动态规划
- 15.1 钢条切割
- 15.2 矩阵链乘法
- 15.3 动态规划原理
- 15.4 最长公共子序列
- 15.5 最优二叉搜索树
- 思考题
- 本章注记
第 16 章 贪心算法
- 16.1 活动选择问题
- 16.2 贪心算法原理
- 16.3 赫夫曼编码
- 16.4 拟阵和贪心算法
- 16.5 用拟阵求解任务调度问题
- 思考题
- 本章注记
第 17 章 摊还分析
- 17.1 聚合分析
- 17.2 核算法
- 17.3 势能法
- 17.4 动态表
- 17.4.1 表扩张
- 17.4.2 表扩张和收缩
- 思考题
- 本章注记
第五部分 高级数据结构
第 18 章 B 树
- 18.1 B 树的定义
- 18.2 B 树上的基本操作
- 18.3 从 B 树中删除关键字
- 思考题
- 本章注记
第 19 章 斐波那契堆
- 19.1 斐波那契堆结构
- 19.2 可合并堆操作
- 19.3 关键字减值和删除一个结点
- 19.4 最大度数的界
- 思考题
- 本章注记
第 20 章 van Emde Boas 树
- 20.1 基本方法
- 20.2 递归结构
- 20.2.1 原型 van Emde Boas 结构
- 20.2.2 原型 van Emde Boas 结构上的操作
- 20.3 van Emde Boas 树及其操作
- 20.3.1 van Emde Boas 树
- 20.3.2 van Emde Boas 树的操作
- 思考题
- 本章注记
第 21 章 用于不相交集合的数据结构
- 21.1 不相交集合的操作
- 21.2 不相交集合的链表表示
- 21.3 不相交集合森林
- *21.4 带路径压缩的按秩合并的分析
- 思考题
- 本章注记
第六部分 图算法
第 22 章 基本的图算法
- 22.1 图的表示
- 22.2 广度优先搜索
- 22.3 深度优先搜索
- 22.4 拓扑排序
- 22.5 强连通分量
- 思考题
- 本章注记
第 23 章 最小生成树
- 23.1 最小生成树的形成
- 23.2 Kruskal 算法和 Prim 算法
- 思考题
- 本章注记
第 24 章 单源最短路径
- 24.1 Bellman-Ford 算法
- 24.2 有向无环图中的单源最短路径问题
- 24.3 Dijkstra 算法
- 24.4 差分约束和最短路径
- 24.5 最短路径性质的证明
- 思考题
- 本章注记
第 25 章 所有结点对的最短路径问题
- 25.1 最短路径和矩阵乘法
- 25.2 FloydWarshall 算法
- 25.3 用于稀疏图的 Johnson 算法
- 思考题
- 本章注记
第 26 章 最大流
- 26.1 流网络
- 26.2 Ford\Fulkerson 方法
- 26.3 最大二分匹配
- 26.4 推送重贴标签算法
- 26.5 前置重贴标签算法
- 思考题
- 本章注记
第七部分 算法问题选编
第 27 章 多线程算法
- 27.1 动态多线程基础
- 27.2 多线程矩阵乘法
- 27.3 多线程归并排序
- 思考题
- 本章注记
第 28 章 矩阵运算
- 28.1 求解线性方程组
- 28.2 矩阵求逆
- 28.3 对称正定矩阵和最小二乘逼近
- 思考题
- 本章注记
第 29 章 线性规划
- 29.1 标准型和松弛型
- 29.2 将问题表达为线性规划
- 29.3 单纯形算法
- 29.4 对偶性
- 29.5 初始基本可行解
- 思考题
- 本章注记
第 30 章 多项式与快速傅里叶变换
- 30.1 多项式的表示
- 30.2 DFT 与 FFT
- 30.3 高效 FFT 实现
- 思考题
- 本章注记
第 31 章 数论算法
- 31.1 基础数论概念
- 31.2 最大公约数
- 31.3 模运算
- 31.4 求解模线性方程
- 31.5 中国余数定理
- 31.6 元素的幂
- 31.7 RSA 公钥加密系统
- 31.8 素数的测试
- 31.9 整数的因子分解
- 思考题
- 本章注记
第 32 章 字符串匹配
- 32.1 朴素字符串匹配算法
- 32.2 Rabin\Karp 算法
- 32.3 利用有限自动机进行字符串匹配
- 32.4 Knuth-Morris-Pratt 算法
- 思考题
- 本章注记
第 33 章 计算几何学
- 33.1 线段的性质
- 33.2 确定任意一对线段是否相交
- 33.3 寻找凸包
- 33.4 寻找最近点对
- 思考题
- 本章注记
第 34 章 NP 完全性
- 34.1 多项式时间
- 34.2 多项式时间的验证
- 34.3 NP 完全性与可归约性
- 34.4 NP 完全性的证明
- 34.5 NP 完全问题
- 34.5.1 团问题
- 34.5.2 顶点覆盖问题
- 34.5.3 哈密顿回路问题
- 34.5.4 旅行商问题
- 34.5.5 子集和问题
- 思考题
- 本章注记
第 35 章 近似算法
- 35.1 顶点覆盖问题
- 35.2 旅行商问题
- 35.2.1 满足三角不等式的旅行商问题
- 35.2.2 一般旅行商问题
- 35.3 集合覆盖问题
- 35.4 随机化和线性规划
- 35.5 子集和问题
- 思考题
- 本章注记
第八部分 附录:数学基础知识
- 附录 A 求和
- A.1 求和公式及其性质
- A.2 确定求和时间的界
- 思考题
- 附录注记
- 附录 B 集合等离散数学内容
- B.1 集合
- B.2 关系
- B.3 函数
- B.4 图
- B.5 树
- B.5.1 自由树
- B.5.2 有根树和有序树
- B.5.3 二叉树和位置树
- 思考题
- 附录注记
- 附录 C 计数与概率
- C.1 计数
- C.2 概率
- C.3 离散随机变量
- C.4 几何分布与二项分布
- *C.5 二项分布的尾部
- 思考题
- 附录注记
- 附录 D 矩阵
- D.1 矩阵与矩阵运算
- D.2 矩阵基本性质
- 思考题
- 附录注记
- 参考文献
- 索引