算法引论:一种创造性方法(书)

来源:互联网 发布:java 形参的生命周期 编辑:程序博客网 时间:2024/04/30 15:09
原书名:Introduction to Algorithms: A Creative Approach
原出版社:Addison Wesley/Pearson
作者:(美)Udi Manber
译者:黄林鹏 谢瑾奎 陆首博
丛书名:国外计算机科学教材系列
出版社:电子工业出版社
ISBN:9787121016653
出版日期:2005年09月
开本:16开
页码:334
版次:1-1

目录


第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测试已经成为衡量搜索引擎质量的评估标准.

前言


编写本书的动机来源于我在教学实践中常常无法为给定算法给出清晰解析的困惑. 与许多教师一样, 我发现对一些学生来说, 要他们亲自动手解决一些简单问题有困难, 而让他们理解给定问题的解决方案同样有困难. 我相信, 事物的两个方面——创造和解释——是相关而不可分离的. 为了完全了解一个问题, 考察最后的答案远远不够, 我们必须了解问题的求解过程.
本书强调了算法设计的创造性方面, 其主要目的是要告诉读者如何去设计一个新的算法. 本书描述算法的顺序不是“问题x. 算法A. 算法A'. 程序P. 程序P'”, 而是像(但并不总是)“问题X. 直接明了的问题求解算法. 缺点. 改进这些缺点的困难. (可能包含一些错误的)好的算法. 进一步的改进. 分析以及其他方法和算法的关系”. 本书的目标不是给出一个容易转换为程序代码的算法, 而是希望读者理解算法的原理. 算法因此被解释为创造过程而不是最终产品. 我们讲授算法的目标不仅是说明如何求解特定的问题, 还包括传授如何求解未来将产生或遇到的新问题的技术. 可以说, 讲授算法设计的思维过程与讲授问题求解细节是同样重要的.
为了进一步帮助读者构建算法创造的思维过程, 本书在算法设计过程中使用的是一种“老兵新传”式的方法学. 该方法学除了涵盖许多已知的算法设计技术外, 还是一个优雅的. 能深人解释算法设计的直觉的框架. 然而, 该方法学并不能遍及算法设计所有可能的方法, 我们也不打算专用该方法学于算法设计过程. 该方法学的核心在于使用归纳法进行数学定理证明的智能过程与组合算法设计过程之间的相似性. 尽管这两个过程的目的不同. 取得结果的类型有异, 但它们的相似程度却比表面上看起来更多. 此相似性也已被许多人注意. 本书的新颖性在于对该相似性所进行的深度发掘, 并将说明该相似性除了涵盖许多已知的算法设计技术外, 还可以在相当程度上帮助算法的创建. 对于该方法学, 本书第l章先做了简单的介绍, 然后在第5章中进行形式化讨论.
考虑下面的类比. 你来到一座陌生的城市, 租了一辆车, 现在想知道旅馆的方向. 这时如果别人喋喋不休地告诉你城市的历史. 布局和交通状况, 你肯定会觉得非常厌烦. 你所需要的其实是诸如“向前开. 过两个街区. 右转. 再直着向前开三英里”这样的信息. 然而, 如果计划在这座城市里生活较长的时间, 那么你的看法就会有所改变. 你可能希望在另一个方向上行驶一段时间(假定能找到一个人告诉你方向), 慢慢地你将对城市有更多的了解. 虽然本书也包含了许多问题的求解和解析, 但它不是一本告诉你所有具体目标其方位的书籍, 主要强调的是一般性的原理和方法. 本书的学习具有挑战性, 它需要读者的深入思考, 而我相信额外的努力是值得的.
在许多不同领域, 如数学. 统计学. 细胞生物学和工程学科, 高效非数值算法的设计已变得非常重要, 本书可作为算法和非数值计算的导论性书籍. 许多专业人士, 甚至那些未曾和计算机有过紧密接触的科学家, 会认为程序设计是一种低级且无需智能的活动. 这种看法将导致简单. 低效. 价值不高的问题解决方案, 而忽视优雅. 高效算法的存在. 本书的目的就是要向读者说明-算法设计是一门既重要又雅致的学问.
本书是自包含的, 大部分内容很直观, 技术性细节尽量保持到最少或者与讨论的主题内容分离, 特别是我们将算法实现细节和算法思想尽可能分离, 书中许多算法的设计都强调了这一原则. 本书并不是以哪些内容必须掌握和牢记这样的方式来设计的, 而是通过思想. 例子. 反例. 修改. 改进等一系列过程加以阐述. 在大多数算法描述内容的后面给出了算法的伪代码, 每章都包含习题和相关的文献目录. 大部分章节后面的习题可分为两类:操练型和创造型. 操练型习题的目的在于检查读者对于书中特定例子和算法的理解, 创造型习题的目的在于检查读者应用相应章节所介绍的特定算法和技术于新问题求解的能力. 本书最后给出了一些精选习题(习题编号加上了下划线)的答案.
本书组织如下. 第1章到第4章的内容是介绍性的. 第2章涉及数学归纳法, 就我看来, 数学归纳法对于算法设计是非常重要的, 熟悉归纳法对于算法设计来说有莫大的帮助. 遗憾的是计算机科学系的学生对于归纳证明不是十分了解, 因此对一些学生来说, 第2章的内容可能比较困难, 建议他们在第一次阅读本书的时候跳过那些有难度的例子, 待适当时候再回过头来研究. 第3章涉及算法分析, 描述了算法分析的过程, 并给出对本书所讨论的算法进行简单分析所需要的工具. 第4章介绍了数据结构, 那些对数据结构熟悉且具备一定数学基础的同学可以直接跳到第5章(但阅读一下也是有益的)学习. 第5章提出了与归纳证明进行类比的算法设计思想, 并给出一些简单的例子, 描述了算法设计过程. 如果你没有太多时间, 只打算阅读本书的一章, 则请直接阅读第5章.
一般来说, 有关算法的书籍有两种不同的组织结构, 一种是按照领域进行分类的, 如分成图算法. 几何算法等, 另一种是按照算法设计技术进行分类的. 虽然本书强调的是算法设计技术, 但我选择了前者. 本书第6章到第9章分别给出了下面4个领域的算法:序列和集合的算法(如排序. 序列比较. 匹配等). 图算法(如生或树. 最短路径. 匹配等)几何算法(如凸包和交集问题等). 代数和数值算法(如矩阵乘法. 快速傅里叶变换等). 这种组织结构不但清晰且易于理解.
第10章涉及归约或约简. 尽管归约的例子也出现在本书前面其他章节之中, 但该主题不但独特而且重要, 因此有必要作为一章的主题. 第10章的内容也是第11章的序幕, 后者涉及NP完全问题. 复杂度理论已经成为算法的基本组成部分, 任何算法设计者都应该了解NP完全问题以及证明相关性质的技术. 第12章介绍了并行算法, 本章包含不同并行计算模型上的几个有意义的算法.
本书内容或许不能在一个学期之内讲授完毕. 因此对于教师来说就有多种不同的选择. 开设的第一门算法设计课程可在某种深度上涉及第3章. 第5章. 第6章. 第7章和第8章的部分内容, 这些章节的高级部分以及第9章. 第10章. 第11章和12章的内容是可选的, 它们也可作为高级算法课程的基础.
致谢
首先要感谢我的妻子Rachel对于本书的帮助, 对本书所基于的方法学她给出了指导性的建议, 对于本书的内容她也给出了许多意见和忠告, 可以说没有她就没有本书. 特别感谢Jan
Van Leuwen对本书大部分章节所给出的全面的评论. 这些详细的意见. 建议和修正方案为本书增色不少. 感谢Eric Bach. Darrah
Chavey. Kirk Pruhs和Sun Wu, 他们在阅读了本书的部分手稿后给出了建设性的意见, 感谢Guy T. Almes(赖斯大学). Agnes
H. Chan(美国东北大学). Dan Gusfield(加州大学Davis分校). David Harel(以色列魏兹曼学院). Daniel
Hirschberg(加州大学Irvine分校). Jefferey H. Kingston(爱荷华大学). Victor
Klee(华盛顿大学). Charles Martel(加州大学Davis分校). Michael J. Quinn(新罕布什尔大学)和Diane
M. Spresser(詹姆士·麦迪逊大学).
感谢Addison-Wesley出版公司的编辑没有施加给我通常作者所经历的有关书籍出版的恐怖经历, 他们乐于助人, 并且充满耐心. 特别感谢主管Bette
Aaronson, 本书的编辑Jim
DeWolf和LynDupre, 他们在写作过程中引导我, 尽管知道有更好的方法, 但他们仍然允许我按照自己的方式行事. 在这里, 我要感谢美国自然科学基金总统青年研究奖的资助以及AT&T. 数字设备公司. 惠普公司和Tektronix公司的资助.
然而, 必须强调的是, 最后的手稿是由排版人员(即作者自己)准备的, 他决定了这里所列举的许多人员对本书的评论和建议的取舍, 并且将对最后的结果负责.
乌迪·曼博
于美国亚利桑那州图森市
原创粉丝点击