前 言
在计算机出现之前,就有了算法。现在有了计算机,就需要更多的算法,算法是计算的核心。
本书提供了对当代计算机算法研究的一个全面、综合的介绍。书中给出了多个算法,并对它们进行了较为深入的分析,使得这些算法的设计和分析易于被各个层次的读者所理解。我们力求在不牺牲分析的深度和数学严密性的前提下,给出深入浅出的说明。
书中每一章都给出了一个算法、一种算法设计技术、一个应用领域或一个相关的主题。算法是用英语和一种“伪代码”来描述的,任何有一点程序设计经验的人都能看得懂。书中给出了244幅图,说明各个算法的工作过程。我们强调将算法的效率作为一种设计标准,对书中的所有算法,都给出了关于其运行时间的详细分析。
本书主要供本科生和研究生的算法或数据结构课程使用。因为书中讨论了算法设计中的工程问题及其数学性质,所以,本书也可以供专业技术人员自学之用。
本书是第3版。在这个版本里,我们对全书进行了更新,包括新增了若干章、修订了伪代码等。
致使用本书的教师
本书的设计目标是全面、适用于多种用途。它可用于若干课程,从本科生的数据结构课程到研究生的算法课程。由于书中给出的内容比较多,只讲一学期一般讲不完,因此,教师们应该将本书看成是一种“缓存区”或“瑞典式自助餐”,从中挑选出能最好地支持自己希望教授的课程的内容。
教师们会发现,要围绕自己所需的各个章节来组织课程是比较容易的。书中的各章都是相对独立的,因此,你不必担心意想不到的或不必要的各章之间的依赖关系。每一章都是以节为单位,内容由易到难。如果将本书用于本科生的课程,可以选用每一章的前面几节内容;用于研究生的课程中,则可以完整地讲授每一章。
全书包含957道练习和158道思考题。每一节结束时给出练习,每一章结束时给出思考题。练习一般比较短,用于检查学生对书中内容的基本掌握情况。有一些是简单的自查性练习,有一些则要更充实,可以作为家庭作业布置给学生。每一章后的思考题都是一些叙述较为详细的实例研究,它们常常会介绍一些新的知识。一般来说,这些思考题都会包含几个小问题,引导学生逐步得到问题的解。
在那些不太适合本科生、更适合研究生的章节和练习前面,都加上了星号。带星号的章节也不一定就比不带星号的更难,但可能要求了解更多的数学知识。类似地,带星号的练习可能要求有更好的数学背景或创造力。
致使用本书的学生
希望本教材能为学生提供关于算法这一领域的有趣介绍。我们力求使书中给出的每一个算法都易于理解和有趣。为了在学生遇到不熟悉或比较困难的算法时提供帮助,我们逐个步骤地描述每一个算法。此外,为了便于大家理解书中对算法的分析,对于其中所需的数学知识,我们给出了详细的解释。如果对某一主题已经有所了解,会发现根据书中各章的编排顺序,可以跳过一些介绍性的小节,直接阅读更高级的内容。
本书是一本大部头著作,学生所修的课程可能只讲授其中的一部分。我们试图使它能成为一本现在对学生有用的教材,并在其将来的职业生涯中,也能成为一本案头的数学参考书或工程实践手册。
目 录
第一部分 基础知识
第1章 算法在计算中的作用
1.1 算法
1.2 作为一种技术的算法
思考题
本章注记
第2章 算法基础
2.1 插入排序
2.2 分析算法
2.3 设计算法
2.3.1 分治法
2.3.2 分析分治算法
思考题
本章注记
第3章 函数的增长
3.1 渐近记号
3.2 标准记号与常用函数
思考题
本章注记
第4章 分治策略
4.1 最大子数组问题
4.2 矩阵乘法的Strassen算法
4.3 用代入法求解递归式
4.4 用递归树方法求解递归式
4.5 用主方法求解递归式
*4.6 证明主定理
4.6.1 对b的幂证明主定理
4.6.2 向下取整和向上取整
思考题
本章注记