数据结构与算法研究(强烈推荐)
内容提要 第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章的三种数据结构以及本章介绍的斐波那契堆进行了分析。