前言
本书讨论数据结构和算法分析。数据结构主要研究组织大量数据的方法,而算法分析则是对算法运行时间的评估。随着计算机的速度越来越快,对于能够处理大量输入数据的程序的需求变得日益急切。可是,由于在输入量很大的时候,程序的低效率现象变得非常明显,因此这又要求对效率问题给予更仔细的关注。通过在实际编程之前对算法的分析,学生可以决定一个特定的解法是否可行。例如,学生在本书中将读到一些特定的问题并看到精心的实现方法是如何把对大量数据的时间限制从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月



按 Ctrl+p 打印本页】【关闭