描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787111528395丛书名: 计算机科学丛书
本书是国外数据结构与算法分析方面的经典教材,使用卓越的Java编程语言作为实现工具讨论了数据结构(组织大量数据的方法)和算法分析(对算法运行时间的估计)。本书把算法分析与*有效率的Java程序的开发有机地结合起来,深入分析每种算法,内容全面、缜密严格,并细致讲解精心构造程序的方法。
出版者的话前言第1章 引论11.1 本书讨论的内容11.2 数学知识复习21.2.1 指数21.2.2 对数21.2.3 级数21.2.4 模运算41.2.5 证明的方法41.3 递归简论51.4 实现泛型构件pre-Java 571.4.1 使用Object表示泛型81.4.2 基本类型的包装91.4.3 使用接口类型表示泛型91.4.4 数组类型的兼容性101.5 利用Java 5泛型特性实现泛型构件111.5.1 简单的泛型类和接口111.5.2 自动装箱/拆箱111.5.3 菱形运算符121.5.4 带有限制的通配符121.5.5 泛型static方法141.5.6 类型限界141.5.7 类型擦除151.5.8 对于泛型的限制151.6 函数对象16小结18练习18参考文献19第2章 算法分析202.1 数学基础202.2 模型222.3 要分析的问题222.4 运行时间计算242.4.1 一个简单的例子242.4.2 一般法则242.4.3 子序列和问题的求解262.4.4 运行时间中的对数312.4.5 分析结果的准确性33小结33练习34参考文献37第3章 表、栈和队列393.1 抽象数据类型393.2 表ADT393.2.1 表的简单数组实现403.2.2 简单链表403.3 Java Collections API中的表413.3.1 Collection接口413.3.2 Iterator接口423.3.3 List接口、ArrayList类和LinkedList类433.3.4 例子:remove方法对LinkedList类的使用443.3.5 关于ListIterator接口463.4 ArrayList类的实现463.4.1 基本类463.4.2 迭代器、Java嵌套类和内部类493.5 LinkedList类的实现523.6 栈ADT583.6.1 栈模型583.6.2 栈的实现593.6.3 应用593.7 队列ADT653.7.1 队列模型653.7.2 队列的数组实现653.7.3 队列的应用66小结67练习67第4章 树714.1 预备知识714.1.1 树的实现724.1.2 树的遍历及应用724.2 二叉树754.2.1 实现764.2.2 例子:表达式树764.3 查找树ADT——二叉查找树784.3.1 contains方法794.3.2 findMin方法和findMax方法804.3.3 insert方法804.3.4 remove方法824.3.5 平均情况分析834.4 AVL树864.4.1 单旋转874.4.2 双旋转894.5 伸展树944.5.1 一个简单的想法(不能直接使用)954.5.2 展开964.6 再探树的遍历1004.7 B树1014.8 标准库中的集合与映射1054.8.1 关于Set接口1054.8.2 关于Map接口1054.8.3 TreeSet类和TreeMap类的实现1064.8.4 使用多个映射的实例106小结111练习111参考文献115第5章 散列1175.1 一般想法1175.2 散列函数1175.3 分离链接法1195.4 不用链表的散列表1235.4.1 线性探测法1235.4.2 平方探测法1245.4.3 双散列1295.5 再散列1305.6 标准库中的散列表1325.7 坏情形下O(1)访问的散列表 1335.7.1 完美散列1335.7.2 布谷鸟散列1355.7.3 跳房子散列1435.8 通用散列法1465.9 可扩散列148小结149练习150参考文献153第6章 优先队列(堆)1566.1 模型1566.2 一些简单的实现1566.3 二叉堆1576.3.1 结构性质1576.3.2 堆序性质1576.3.3 基本的堆操作1586.3.4 其他的堆操作1626.4 优先队列的应用1646.4.1 选择问题1646.4.2 事件模拟1656.5 d-堆1666.6 左式堆1676.6.1 左式堆性质1676.6.2 左式堆操作1686.7 斜堆1726.8 二项队列1736.8.1 二项队列结构1746.8.2 二项队列操作1746.8.3 二项队列的实现1766.9 标准库中的优先队列180小结180练习181参考文献184第7章 排序1867.1 预备知识1867.2 插入排序1867.2.1 算法1867.2.2 插入排序的分析1877.3 一些简单排序算法的下界1877.4 希尔排序1887.5 堆排序1917.6 归并排序1937.7 快速排序1987.7.1 选取枢纽元1997.7.2 分割策略2007.7.3 小数组2027.7.4 实际的快速排序例程2027.7.5 快速排序的分析2037.7.6 选择问题的线性期望时间算法2067.8 排序算法的一般下界2077.9 选择问题的决策树下界2097.10 对手下界2107.11 线性时间的排序:桶排序和基数排序2127.12 外部排序2167.12.1 为什么需要一些新的算法2177.12.2 外部排序模型2177.12.3 简单算法2177.12.4 多路合并2187.12.5 多相合并2197.12.6 替换选择219小结220练习221参考文献225第8章 不相交集类2278.1 等价关系2278.2 动态等价性问题2278.3 基本数据结构2298.4 灵巧求并算法2318.5 路径压缩2338.6 路径压缩和按秩求并的坏情形2348.6.1 缓慢增长的函数2358.6.2 利用递归分解的分析2358.6.3 O(M log*N)界2408.6.4 O(Mα(M,N))界2408.7 一个应用241小结243练习243参考文献244第9章 图论算法2469.1 若干定义2469.2 拓扑排序2489.3 短路径算法2509.3.1 无权短路径2519.3.2 Dijkstra算法2549.3.3 具有负边值的图2589.3.4 无圈图2599.3.5 所有点对短路径2619.3.6 短路径的例子2619.4 网络流问题2629.5 小生成树2679.5.1 Prim算法2679.5.2 Kruskal算法2699.6 深度优先搜索的应用2709.6.1 无向图2709.6.2 双连通性2719.6.3 欧拉回路2739.6.4 有向图2759.6.5 查找强分支2769.7 NP-完全性介绍2779.7.1 难与易2789.7.2 NP类2789.7.3 NP-完全问题279小结280练习280参考文献284第10章 算法设计技巧28810.1 贪婪算法28810.1.1 一个简单的调度问题28810.1.2 哈夫曼编码29010.1.3 近似装箱问题29310.2 分治算法29810.2.1 分治算法的运行时间29810.2.2 近点问题30010.2.3 选择问题30210.2.4 一些算术问题的理论改进30410.3 动态规划30710.3.1 用一个表代替递归30710.3.2 矩阵乘法的顺序安排30910.3.3 二叉查找树31110.3.4 所有点对短路径31210.4 随机化算法31410.4.1 随机数发生器31510.4.2 跳跃表31910.4.3 素性测试32010.5 回溯算法32210.5.1 收费公路重建问题32310.5.2 博弈326小结331练习331参考文献336第11章 摊还分析34011.1 一个无关的智力问题34011.2 二项队列34011.3 斜堆34411.4 斐波那契堆34511.4.1 切除左式堆中的节点34611.4.2 二项队列的懒惰合并34711.4.3 斐波那契堆操作34911.4.4 时间界的证明35011.5 伸展树351小结354练习354参考文献355第12章 高级数据结构及其实现35612.1 自顶向下伸展树35612.2 红黑树36212.2.1 自底向上的插入36212.2.2 自顶向下红黑树36312.2.3 自顶向下的删除36712.3 treap树36812.4 后缀数组与后缀树37012.4.1 后缀数组37112.4.2 后缀树37312.4.3 线性时间的后缀数组和后缀树的构建37512.5 k-d树38512.6 配对堆387小结392练习393参考文献396索引399
本书目标 本书新的Java版论述数据结构——组织大量数据的方法,以及算法分析——算法运行时间的估计。随着计算机的速度越来越快,对于能够处理大量输入数据的程序的需求变得日益迫切。可是,由于在输入量很大的时候程序的低效率变得非常明显,因此这又要求对效率问题给予更仔细的关注。通过在实际编程之前对算法的分析,我们可以确定某个特定的解法是否可行。例如,查阅本书中一些特定的问题,可以看到我们如何通过巧妙的实现,将其处理大量数据的时间限制从几个世纪减至不到1秒。因此,我们在提出所有算法和数据结构时都会阐释其运行时间。在某些情况下,对于影响实现的运行时间的一些微小细节都需要认真探究。 一旦确定了解法,接着就要编写程序。随着计算机功能的日益强大,它们必须解决的问题也变得更加庞大和复杂,这就要求我们开发更加复杂的程序。本书的目的是同时教授学生良好的程序设计技巧和算法分析能力,使得他们能够以的效率开发出这种程序。 本书适用于高级数据结构(CS7)课程或是年研究生的算法分析课程。学生应该掌握一些中级编程知识,包括基于对象的程序设计和递归等内容,并具备一些离散数学的背景。 第3版中显著的变化 第3版订正了大量的错误,也修改了很多地方,以使内容更加清晰。此外还有以下修订: ●第4章包括了AVL树的删除算法——这也是读者经常需要的内容。 ●第5章进行了大量修改和扩充,现在包含两种新算法:布谷鸟散列(cuckoo hashing)和跳房子散列(hopscotch hashing)。此外还增加了一节讨论通用散列法。 ●第7章现在包含了基数排序的内容,并且增加了一节讨论下界的证明。 ●第8章用到Seidel和Sharir提出的新的并查集分析,并且证明了O(Mα(M,N))界,而不是前一版中比较弱的O(Mlog*N)界。 ●第12章增加了后缀树和后缀数组的内容,包括Karkkainen和Sanders提出的构造后缀数组的线性时间算法(附带实现)。关于确定性跳跃表和AA树的章节被删除。 ●通篇代码已做更新,使用了Java 7的菱形运算符。 处理方法 虽然本书的内容大部分都与语言无关,但是,程序设计还是需要使用某种特定的语言。正如书名所示,我们为本书选择了Java。 人们常常将Java和C 比较。Java具有许多优点,程序员常常把Java看成是一种比C 更安全、更具有可移植性并且更容易使用的语言。因此,这使得它成为讨论和实现基础数据结构的一种优秀的核心语言。Java的其他重要的方面,诸如线程和GUI(图形用户界面),虽然很重要,但是本书并不需要,因此也就不再讨论。 完整的Java和C 版数据结构均在互联网上提供。我们采用相似的编码约定以使得这两种语言之间的对等性更加明显。 内容概述 第1章包含离散数学和递归的一些复习材料。我相信熟练掌握递归的办法是反复不断地研读一些好的用法。因此,除第5章外,递归遍及本书每一章的例子之中。第1章还介绍了一些相关内容,作为对Java中“继承”的复习,包括对Java泛型的讨论。 第2章讨论算法分析,阐述渐近分析及其主要缺点,提供了许多例子,包括对对数级运行时间的深入分析。我们通过直观地把递归程序转变成迭代程序,对一些简单递归程序进行了分析。更复杂的分治程序也在此介绍,不过有些分析(求解递推关系)要推迟到第7章再进行详细讨论。 第3章介绍表、栈和队列。包括对Collections API ArrayList类和LinkedList类的讨论,提供了Collections API ArrayList类和LinkedList类的一个重要子集的若干实现。 . 第4章讨论树,重点是查找树,包括外部查找树(B-树)。UNIX文件系统和表达式树是作为例子来介绍的。这一章还介绍了AVL树和伸展树。查找树实现细节的更仔细的处理可在第12章找到。树的另外一些内容(如文件压缩和博弈树)推迟到第10章讨论。外部介质上的数据结构作为若干章中的后论题来考虑。对于Collections API TreeSet类和TreeMap类的讨论,则通过一个重要的例子来展示三种单独的映射在求解同一个问题中的使用。 第5章讨论散列表,既包括经典算法,如分离链接法和线性及平方探测法,同时也包括几个新算法,如布谷鸟散列和跳房子散列。本章还讨论了通用散列法,并且在章末讨论了可扩散列。 第6章是关于优先队列的。二叉堆也在这里讲授,还有些附加的材料论述优先队列某些理论上有趣的实现方法。斐波那契堆在第11章讨论,配对堆在第12章讨论。 第7章论述排序。这一章特别关注编程细节和分析。所有重要的通用排序算法均在该章进行了讨论和比较。此外,还对四种排序算法做了详细的分析,它们是插入排序、希尔排序、堆排序以及快速排序。这一版新增的是基数排序以及对选择类问题的下界的证明。本章末尾讨论了外部排序。 第8章讨论不相交集算法并证明其运行时间。分析部分是新的。这是简短且特殊的一章,如果不讨论Kruskal算法则可跳过该章。 第9章讲授图论算法。图论算法之所以有趣,不仅因为它们在实践中经常出现,而且还因为它们的运行时间强烈地依赖于数据结构的恰当使用。实际上,所有标准算法都和适用的数据结构、伪代码以及运行时间的分析一起介绍。为了恰当地理解这些问题,我们对复杂性理论(包括NP-完全性和不可判定性)进行了简短的讨论。 第10章通过考察一般性的问题求解技术来介绍算法设计。本章通过大量的例子来增强理解。这一章及后面各章使用的伪代码使得读者在理解例子时不会被实现的细节所困扰。 第11章处理摊还分析,主要分析三种数据结构,它们分别在第4章、第6章以及本章(斐波那契堆)介绍。 第12章讨论查找树算法、后缀树和数组、k-d树和配对堆。不同于其他各章,本章给出了查找树和配对堆完整且仔细的实现。材料的安排使得教师可以把一些内容纳入其他各章的讨论之中。例如,第12章中的自顶向下红黑树可以和(第4章的)AVL树一起讨论。 第1~9章为大多数一学期的数据结构课程提供了足够的材料。如果时间允许,那么第10章也可以包括进来。研究生的算法分析课程可以使用第7~11章的内容。第11章所分析的高级数据结构可以很容易地被前面各章所提及。第9章里所讨论的NP-完全性太过简短,不适用于这样的课程。另外再用一部NP-完全性方面的著作作为本教材的补充可能是比较有益的。 练习 每章末尾提供的练习与正文中所述内容的顺序相一致。后的一些练习是对应整章而不是针对特定的某一节的。难度较大的练习标有一个星号,更具挑战的练习标有两个星号。 参考文献 参考文献列于每章的后。通常,这些参考文献或者是具有历史意义的、给出书中材料的原始出处,或者阐述对书中给出的结果的扩展和改进。有些文献为一些练习提供了解法。 补充材料 下面的补充材料在www.pearsonhighered.com/cssupport对所有读者公开: ●例子程序的源代码 此外,下述材料仅提供给经培生教师资源中心(Pearson’s Instructor Resource Center,IRC)(www.pearsonhighered.com/irc)认可的教师。有意者请访问IRC或联系培生的校园代表以获得访问权限。关于本书教辅资源,用书教师可向培生教育出版集团北京代表处申请,电话:010-5735 5169/5735 5171,电子邮件:[email protected]。——编辑注 ●部分练习的解答 ●来自本书的一些附图 致谢 在本书的准备过程中,我得到了许多人的帮助,有些已在本书的其他版本中列出,感谢大家。 一如既往地,培生的专家们的努力使得本书的写作过程更加轻松。我愿在此感谢我的编辑Michael Hirsch以及制作编辑Pat Brown。我还要感谢Abinaya Rajendran和她在Integra Software Services的同事,感谢他们使后的散稿成书的出色工作。贤妻Jill所做的每一件事情都值得我特别感谢。 后,我还想感谢发来E-mail并指出前面各版中错误和矛盾之处的广大读者。我的网页www.cis.fiu.edu/~weiss包含更新后的源代码(用Java和C 编写)、勘误表以及提交问题报告的链接。 M.A.W. 佛罗里达州迈阿密市
水云之间 –
写的比较系统,讲的比较深入,适合有一定编程经验的人学习
子安 –
好书 两个月了 但是 书后面的习题真的是需要蛮长的时间来做的
咱爸咱妈 –
书很好,就是翻译和排版有点烂,编辑没有好好检验吗?还有排版简直不能忍,敢把图放在文字前面吗?