书中详细介绍了当前流行的论题和新的变化,讨论了算法设计技巧,并在研究算法的性能、效率以及对运行时间分析的基础上考查了一些高级数据结构,从历史的角度和近年的进展对数据结构的活跃领域进行了简要的概括。由于本书选材新颖,方法实用,题例丰富,取舍得当。本书的目的是培养学生良好的程序设计技巧和熟练的算法分析能力,使得他们能够开发出高效率的程序。从服务于实践又锻炼学生实际能力出发,书中提供了大部算法的C程序和伪码例程,但并不是全部。一些程序可从互联网上获得。\r\n 本书是《Data Structures and Algorithm Analysis in C》一书第2版的简体中译本。原书曾被评为20世纪顶尖的30部计算机著作之一,作者Mark Allen Weiss在数据结构和算法分析方面卓有建树,他的数据结构和算法分析的著作尤其畅销,并受到广泛好评.已被世界500余所大学用作教材。 \r\n 在本书中,作者更加精炼并强化了他对算法和数据结构方面创新的处理方法。通过C程序的实现,着重阐述了抽象数据类型的概念,并对算法的效率、性能和运行时间进行了分析。 \r\n 全书特点如下: \r\n ●专用一章来讨论算法设计技巧,包括贪婪算法、分治算法、动态规划、随机化算法以及回溯算法 \r\n ●介绍了当前流行的论题和新的数据结构,如斐波那契堆、斜堆、二项队列、跳跃表和伸展树 \r\n ●安排一章专门讨论摊还分析,考查书中介绍的一些高级数据结构 \r\n ●新开辟一章讨论高级数据结构以及它们的实现,其中包括红黑树、自顶向下伸展树。treap树、k-d树、配对堆以及其他相关内容 \r\n ●合并了堆排序平均情况分析的一些新结果 \r\n 本书是国外数据结构与算法分析方面的标准教材,介绍了数据结构(大量数据的组织方法)以及算法分析(算法运行时间的估算)。本书的编写目标是同时讲授好的程序设计和算法分析技巧,使读者可以开发出具有最高效率的程序。 本书可作为高级数据结构课程或研究生一年级算法分析课程的教材,使用本书需具有一些中级程序设计知识,还需要离散数学的一些背景知识。
出版者的话\r\n专家指导委员会\r\n译者序\r\n前言 \r\n第1章 引论\r\n第2章 算法分析\r\n第3章 表、栈和队列\r\n第4章 树\r\n第5章 散列\r\n第6章 优先队列(堆)\r\n第7章 排序\r\n第8章 不相交集ADT\r\n第9章 图论算法\r\n第10章 算法设计技巧\r\n第11章 摊还分析\r\n第12章 高级数据结构及其实现\r\n索引
Mark Allen Weiss是佛罗里达国际大学计算机学院教授,普林斯顿大学计算机科学博士。除本书外,他编写的关于数据结构与算法方面的知名教材还有:Data Structures and Algorithm Analysis:in Java, Data Structures and Algonthm Analysis:in C++以及Data Structures and Problem Solving:Using Jave、Data Struchures and Problem Solving:Using C++等。他目前是AP考试计算机学科委员会的主席。
本书讨论数据结构和算法分析.数据结构主要研究组织大量数据的方法,而算法分析则是对算法运行时间的评估.随着计算机的速度越来越快,对于能够处理大量输入数据的程序的需求变得日益急切.可是,由于在输入量很大的时候,程序的低效率现象变得非常明显,因此这又要求对效率问题给予更仔细的关注.通过在实际编程之前对算法的分析,学生可以决定一个特定的解法是否可行.例如,学生在本书中将读到一些特定的问题并看到精心的实现方法是如何把对大量数据的时间限制从16年减至不到1秒的.因此,若无运行时间的阐释,就不会有算法和数据结构的提出.在某些情况下,对于影响算法实现的运行时间的一些微小细节都需要认真地探究.
一旦解法被确定,程序还是必须要编写的.随着计算机的日益强大,它们必须解决的问题就变得更加巨大和复杂,这就要求开发更加复杂的程序.本书的目的是同时教授学生良好的程序设计技巧和算法分析能力,使得他们能够开发这样的具有最高效率的程序.
本书适合作为高级数据结构(CS7)课程或是研究生第一年算法分析课程的教材.学生应该具有中等程度的程序设计知识,包括像指针和递归这样一些内容,还要具有离散数学的某些知识.
方法
我相信,对于学生重要的是学习如何自己动手编写程序,而不是从书上拷贝程序.但另一方面,讨论现实程序设计问题而不套用样本程序实际上是不可能的.由于这个原因,本书通常提供实现方法的大约一半到四分之三的内容并鼓励学生补足其余的部分.第12章是这一版新加的一章,讨论主要侧重于实现细节的一些附加的数据结构.
本书中的算法均以ANSI C表示,尽管有些欠缺,但它仍然是最流行的系统程序设计语言.C代替Pascal的使用使得动态分配数组成为可能(可见第5章中的“再散列”).它还在几处地方将代码简化,这通常是因为与(&&)操作走捷径的缘故.
对C的大多数批评集中在用它写出的程序代码可读性差的事实上.仅仅少击几次键,却牺牲了程序清晰性,而程序的速度又没有增加.因此,诸如同时赋值以及通过if(x=y)测试是否为0等技巧一般不在本书中使用.相信本书将证明只要细心练习是可以避免那些难以读懂的代码的.
内容提要
第1章包含离散数学和递归的一些复习材料.我相信对递归做到泰然处之的惟一办法是反复不断地看一些好的用法.因此,除第5章外,递归遍及本书每一章的例子之中.
第2章处理算法分析.这一章阐述渐进分析和它的主要弱点.这里提供了许多例子,包括对对数运行时间的深入解释.通过直观地把一些简单递归程序转变成迭代程序而对它们进行分析.介绍了更为复杂的分治程序,不过有些分析(求解递归关系)要推迟到第7章再详细讨论.
第3章包括表.栈和队列.重点放在使用ADT对这些数据结构编程,这些数据结构的快速实现,以及介绍它们的某些用途上.课文中几乎没有什么程序(只有些例程),而程序设计作业的许多思想基本上体现在练习之中.
第4章讨论树,重点在查找树,包括外部查找树(B-树).UNIX文件系统和表达式树是作为例子来介绍的.AVL树和伸展树只作了介绍而没有分析.程序写出75%,其余部分留给学生完成.查找树的实现细节见第12章.树的另外一些内容,如文件压缩和博弈树,延迟到第10章讨论.外部媒体上的数据结构作为几章中的最后论题来讨论.
第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-完全性的讨论对于这门课来说太过简要,Garey和Johnson的论NP-完全性的书(有张立昂等翻译的中文译本:计算机和难解性,科学出版社,1987——译者注)可以补充本书的不足.
练习
在每章末尾提供的练习与书中讲授的内容顺序相匹配.最后的一些练习是针对整个一章而不是特定的某一节.难做的练习标以一个星号,更难的练习标有两个星号.
教师可从Addison-Wesley出版公司得到包含几乎所有练习答案的解题指南.
参考文献
参考文献位于每章的最后.一般说来,这些参考文献或者是历史性的,代表着书中材料的原始来源,或者阐述对书中给出的结果的扩展和改进.有些文献论述了一些练习的解法.
代码的获得
本书中的程序代码通过匿名ftp可在aw.com网站得到.这个网站也可以通过WorldWide Web来访问,其URL为http://www.aw.com/cseng/(从此处继续链接).该资料的准确位置可能变化.
致谢
在本丛书几部著作的准备过程中,本人得到许多朋友的帮助.有些人在本书的其他版本中提到过,谢谢诸位.
对于这一版,我要感谢Addison-Wesley的编辑Carter Shanklin和Susan Hartman.TeriHyde对此书做出了完美的工作,而Matthew Harris和他在Publication Services的同事出色地完成了本书最后的定稿任务.
M.A.W.
Miami,Florida
1996年7月