致谢

致谢

作者:Robert Sedgewick, Kevin Wayne

ACM Fellow, ACM 杰出教育家

本书的编写花了近40年时间,因此想要一一列出所有参与人是不可能的。本书的前几版一共列出了好几十人,其中包括(按字母顺序)Andrew Appel、Trina Avery、Marc Brown、Lyn Dupré、Philippe Flajolet、Tom Freeman、Dave Hanson、Janet Incerpi、Mike Schidlowsky、Steve Summit和Chris Van Wyk。我要感谢他们所有人,尽管其中有些人的贡献要追溯到几十年前。至于第4版,我们要感谢试用了本书样稿的普林斯顿及其他院校的数百名学生,以及通过本书网站发表意见和指出错误的世界各地的读者。

我们还要感谢普林斯顿大学对于高质量教学的坚定支持,这是本书得以面世的基础。

Peter Gordon几乎从本书写作之初就提出了很多有用的建议,这一版奉行的“归本溯源”的指导思想也是他最早提出的。关于第4版,我们要感谢Barbara Wood认真又专业的编辑工作,Julie Nahil对生产过程的管理,以及Pearson出版公司中为本书的付梓和营销辛勤工作的朋友。所有人都在积极地追赶进度,而本书的质量并没有受到丝毫影响。


第 1 章 基础

本书的目的是研究多种重要而实用的算法,即适合用计算机实现的解决问题的方法。和算法关系最紧密的是数据结构,即便于算法操作的组织数据的方法。本章介绍的就是学习算法和数据结构所需要的基本工具。

首先要介绍的是我们的基础编程模型。本书中的程序只用到了 Java 语言的一小部分,以及我们自己编写的用于封装输入输出以及统计的一些库。1.1 节总结了相关的语法、语言特性和书中将会用到的库。

接下来我们的重点是数据抽象并定义抽象数据类型(ADT)以进行模块化编程。在 1.2 节中我们介绍了用 Java 实现抽象数据类型的过程,包括定义它的应用程序编程接口(API)然后通过 Java 的类机制来实现它以供各种用例使用。

之后,作为重要而实用的例子,我们将学习三种基础的抽象数据类型:背包、队列。1.3 节用数组、变长数组和链表实现了背包、队列和栈的 API,它们是全书算法实现的起点和样板。

性能是算法研究的一个核心问题。1.4 节描述了分析算法性能的方法。我们的基本做法是科学式的,即先对性能提出假设,建立数学模型,然后用多种实验验证它们,必要时重复这个过程。

我们用一个连通性问题作为例子结束本章,它的解法所用到的算法和数据结构可以实现经典的 union-find 抽象数据结构。