目录
第1章 引论
第2章 数学归纳法
2.1 引言
2.2 三个简单的例子
2.3 平面内区域的计数
2.4 简单的着色问题
2.5 复杂一些的加法题
2.6 一个简单的不等式
2.7 欧拉公式
2.8 图论中的一个问题
2.9 格雷码
2.10 在图上寻找无重边的路
2.11 数学平均数和几何平均数定理
2.12 循环不变量:将十进制数转换为二进制数
2.13 常见的错误
2.14 小结
第3章 算法分析
3.1 引言
3.2 符号D
3.3 时间与空间复杂度
3.4 求和
3.5 递推关系
3.5.1 巧妙地猜测
3.5.2 分治关系
3.5.3 涉及全部历史的递推关系
3.6 一些有用的证明论据
3.7 小结
第4章 数据结构简介
4.1 引言
4.2 基本数据结构
4.2.1 元素
4.2.2 数组
4.2.3 记录
4.2.4 链表
4.3 树
4.3.1 树的表示
4.3.2 堆
4.3.3 二叉搜索树
4.3.4 AVL树
4.4 散列
4.5 合并—查找问题
4.6 图
4.7 小结
第5章 基于归纳的算法设计
5.1 引言
5.2 多项式求值
5.3 最大导出子图
5.4 寻找一对一映射
5.5 社会名流问题
5.6 分治算法:轮廓问题
5.7 在二叉树中计算平衡因子
5.8 寻找最大连续子序列
5.9 增强归纳假设
5.10 动态规划:背包问题
5.11 常见的错误
5.12 小结
第6章 序列和集合的算法
6.1 引言
6.2 二叉搜索的几种形式
6.2.1 纯二叉搜索
6.2.2 循环序列的二叉搜索
6.2.3 二叉搜索特殊下标
6.2.4 二叉搜索长度未知的序列
6.2.5 重叠子序列问题
6.2.6 解方程
6.3 内插搜索
6.4 排序
6.4.1 桶排序和基数排序
6.4.2 插入排序和选择排序
6.4.3 归并排序
6.4.4 快速排序
6.4.5 堆排序
6.4.6 排序问题的下界
6.5 顺序统计
6.5.1 最大数和最小数
6.5.2 查找第足小的数
6.6 数据压缩
6.7 串匹配
6.8 序列比较
6.9 概率算法
6.9.1 随机数
6.9.2 着色问题
6.9.3 将拉斯维加斯算法变换成确定性算法
6.10 查找众数
6.11 三个展现有趣证明方法的问题
6.11.1 最长递增序列
6.11.2 查找集合中两个最大的元素
6.11.3 计算多重集合的模
6.12 小结
第7章 图算法
7.1 引言
7.2 欧拉图
7.3 图的遍历
7.3.1 深度优先搜索
7.3.2 广度优先搜索
7.4 拓扑排序
7.5 单源最短路径
7.6 最小代价生成树
7.7 全部最短路径
7.8 传递闭包
7.9 图的分解
7.9.1 双连通分支
7.9.2 强连通分支
7.9.3 利用图分解的例子
7.10 配
7.10.1 非常稠密图中的完美匹配
7.10.2 偶图匹配
7.11 网络流量
7.12 哈密尔顿旅行
7.12.1 反向归纳
7.12.2 在非常稠密图中找哈密尔顿回路
7.13 小结
第8章 几何算法
8.1 引言
8.2 判定点是否在多边形内部
8.3 构造简单多边形
8.4 凸包
8.4.1 直接方法
8.4.2 礼品包裹算法
8.4.3 Graham扫描算法
8.5 最近点对
8.6 水平线段和竖直线段的交点
8.7 小结
第9章 代数和数值算法
9.1 引言
9.2 求幂运算
9.3 欧几里得算法
9.4 多项式乘法
9.5 矩阵乘法
9.5.1 Winograd算法
9.5.2 Strassen算法
9.5.3 布尔矩阵
9.6 快速傅里叶变换
9.7 小结
第10章 归约
10.1 引言
10.2 归约的例子
10.2.1 简单字符串匹配问题
10.2.2 特殊代表集
10.2.3 关于序列比较的归约
10.2.4 在无向图中寻找三角形
10.3 有关线性规划的归约
10.3.1 概述与定义
10.3.2 归约到线性规划的例子
10.4 下界的归约
10.4.1 寻找简单多边形算法复杂度的下界
10.4.2 关于矩阵的简单归约
10.5 常见的错误
10.6 小结
第11章 NP完全问题
11.1 引言
11.2 多项式时间归约
11.3 非确定性和Cook定理
11.4 NP完全性的证明例子
11.4.1 顶点覆盖问题
11.4.2 支配集问题
11.4.3 3SAT问题
11.4.4 团问题
11.4.5 3着色问题
11.4.6 一般经验
11.4.7 更多的NP完全问题
11.5 处理NP完全问题的技术
11.5.1 回溯法和分枝限界法
11.5.2 确保性能的近似算法
11.6 小结
第12章 并行算法
12.1 引言
12.2 并行计算模型
12.3 共享存储器算法
12.3.1 并行加
12.3.2 寻找最大数的算法
12.3.3 并行前缀问题
12.3.4 在链表中查寻秩
12.3.5 欧拉遍历技术
12.4 连网络上的算法
12.4.1 阵列上的排序
12.4.2 排序网络
12.4.3 在树中查找第k个最小元素
12.4.4 网孔上的矩阵乘法
12.4.5 超立方体中的路由
12.5 脉动计算
12.5.1 矩阵与向量相乘
12.5.2 卷积问题
12.5.3 序列的比较
12.6 小结
部分习题答案
参考文献
译者序
本书作者乌迪·曼博(Udi Manber)博士是美国著名的计算机科学家, 国际公认的算法大师, 在线信息搜索引擎的先驱. 乌迪·曼博曾是美国亚利桑那大学计算机专业的教授, 离开学校后在雅虎公司担任执行官, 目前是亚马逊(Amazon. com)的副总裁和首席算法师(CAO), 也是亚马逊旗下搜索网站A9. com的首席执行官, 他提出的UDI测试已经成为衡量搜索引擎质量的评估标准.
本书的特色有二, 一是强调算法设计的创造性过程, 而不是拘泥于某个具体算法的详细讨论, 正如常言道“予之以鱼, 不如授之以渔”. 在教学过程中常常发现有许多同学(包括译者自己)不是去掌握算法背后的思想, 而是钻牛角尖, 针对某个算法反复地思考, 或者只是掌握了几个具体的算法就沾沾自喜. 事实上学习算法不外乎两个目的, 一是了解各种算法, 在遇到问题时能灵活地应用所掌握的方法技巧, 二个研究算法设计技术, 当没有现成可用的算法时, 能够创造出问题的求解方法. 前者非常实际, 但后者更加重要, 它涉及创新, 是推动学科发展的源泉. 本书中的习题就很有特色, 大致分为两类, 一类是操练型的, 意在巩固对具体算法的了解, 锻炼学生应用书中介绍的算法以及各种变体的设计能力, 另一类是创造型的, 旨在让学生掌握设计算法的技术而非算法本身, 由此锻炼学生的算法设计能力而不是算法应用能力. 这种体系结构是一种尝试, 虽然目前市面上有许多大部头的算法著作, 包括一些算法大师的名著, 但本书强调的是创造性, 具有浓郁特色, 因此时至今日仍有巨大的价值.
本书的特色之二是将算法设计类比于归纳证明. 事实上, 归纳证明. 递归算法. 递推关系, 它们之间存在着千丝万缕的联系. 对事物, 人们往往是从简单到复杂, 从具体到抽象地进行思考, 猜测存在的性质并试图证明, 最后得到一般性的规律再加以应用. 问题求解也是如此, 我们先从简单的情况出发, 考虑简单问题的解决方案, 然后再推广到一般的情况, 在此过程中需要验证的是这种推广的有效性, 这无疑就是一种归纳证明. 作者将算法设计类比于归纳证明并贯穿全书, 将各种归纳方法演绎得淋漓尽致, 使通常的算法设计有章可循, 更使设计算法成为一种享受.
译者黄林鹏教授与本书的翻译有着不解之缘. 2003年初, 译者的研究生导师左孝凌教授拟修改他的离散数学教材, 准备添置论述归纳法的章节, 由此译者为他收集了许多关于归纳法的材料, 并粗读了其中一部分, 也了解到了一些皮毛. 不料2004年暑假左老师因操劳过度, 竟不辞西去. 译者希望能以这本与归纳法紧密相关的翻译教材的出版向左老师及其未尽事业致敬. 此外就是关于并行计算中的脉动阵列算法, 15年前译者在读博士的时候, 恰好其博士生导师孙永强教授在做关于脉动阵列的研究, 译者得以参与, 并对此稍有了解. 2000年译者在美国哈佛大学进修, 遇到脉动阵列体系结构的创始人之一, 并有幸旁听了他的课程. 而本书最后就是关于脉动阵列算法的, 读来译来, 会有些如偶遇故知和聆听智者教诲的感觉. 虽然脉动阵列是本书成书时的研究热点, 现在时过境迁, 已经是集群计算. 分布对象计算. 网格计算的时代, 但书中涉及的并行算法设计的思想依然璀璨, 富有启迪. 事实上, 正是因为强调的是算法设计的创造陛过程而非算法本身, 才使得本书可以永保活力.
本书的翻译工作由上海交通大学的黄林鹏教授负责, 并与一些老师和博士生共同完成, 其中的第2章. 第4章. 第6章由陆首博初译, 第3章. 第5章. 第7章由谢谨奎初译, 参与本书翻译工作的还有欧佳凡. 黄青. 杨欢. 林海源. 毛宏燕. 黄晓琴. 李东. 刘飞. 林琳. 王佳锃. 耿向阳等同志, 陆朝俊和任庆生副教授对本书一些章节的翻译提供了大量帮助. 在此, 对所有为本书出版提供了帮助的人们表示诚挚的感谢!稿件由黄林鹏修改. 整理和定稿, 并对最终出现的问题负责, 请将批评意见寄至lphuang@sjtu. edu. cn, 不胜感激.
作译者
Udi Manber美国著名的计算机科学家, 国际公认的算法大师, 在线信息搜索引擎的先驱. 1982年于华盛顿大学获得计算机科学博士学位, 曾是美国亚利桑那大学计算机专业教授, 离开学校后在雅虎公司担任执行官, 目前是亚马逊(Amazon.com)的副总裁和首席算法大师(CAO), 也是亚马逊施下搜索网站A9.com的首席执行官, 他提出的UDI测试已经成为衡量搜索引擎质量的评估标准.
前言