高效数据结构的设计与分析,长期以来一直被认为是计算领域的一个重要主题,同时也是计算机科学与计算机工程本科教学中的核心课程。本书介绍数据结构和算法,包括其设计、分析和实现,可在初级数据结构或中级算法导论课程中使用。我们随后会更详细地讨论如何在这些课程中使用本书。
为了提高软件开发的健壮性和可重用性,我们在本书中采取一致的面向对象的视角。面向对象方法的一个主要思想是数据应该被封装,然后提供访问和修改它们的方法。我们不能简单地将数据看作字节和地址的集合,数据对象是抽象数据类型(Abstract Data Type,ADT)的实例,其中包括可在这种类型的数据对象上执行的操作方法的集合。我们强调的是对于一个特定的ADT可能有几种不同的实现策略,并探讨这些选择的优点和缺点。我们几乎为书中的所有数据结构和算法都提供了完整的Python实现,并介绍了将这些实现组织为可重用的组件所需的重要的面向对象设计模式。
通过阅读本书,读者可以:
对常见数据集合的抽象有一定了解(如栈、队列、表、树、图)。
理解生成常用数据结构的高效实现的算法策略。
通过理论方法和实验方法分析算法的性能,并了解竞争策略之间的权衡。
明智地利用编程语言库中已有的数据结构和算法。
拥有大多数基础数据结构和算法的具体实现经验。
应用数据结构和算法来解决复杂的问题。
为了达到最后一个目标,我们在书中提供了数据结构的很多应用实例,包括:文本处理系统,结构化格式(如HTML)的标签匹配,简单的密码技术,文字频率分析,自动几何布局,霍夫曼编码,DNA序列比对,以及搜索引擎索引。
本书特色
本书主要基于由Goodrich和Tamassia所著的《Data Structures and Algorithms in Java》,以及由Goodrich、Tamassia和Mount所著的《Data Structures and Algorithms in C++》编写而成。然而,我们并不是简单地用Python语言实现以上书籍的内容。为了充实内容,我们重新设计了本书:
对全部代码进行了重新设计,以充分利用Python的优势,如使用生成器迭代集合的元素。
在Java和C++版本中,我们提供了很多伪代码,而本书则提供了Python实现的完整代码。
在一般情况下,ADT被定义为与Python内建数据类型和Python的collections模块具有一致的接口。
第5章深入探讨了Python中基于动态数组的内置数据结构,如list、tuple和str类。新增的附录A提供了关于str类功能的进一步讲解。
重新绘制或修改了超过450幅插图。
经过新增和修订,练习的总数达到750个。
在线资源
本书提供一系列丰富的在线资源,可访问以下网站获取:
www.wiley.com/college/goodrich
鼓励学生在学习本书时使用这个网址,以更有效地进行练习并提高对所学知识的认识。也欢迎教师使用本网站来帮助规划、组织和展示他们的课程材料。对于教师和学生而言,网站中包含一系列与本书主题相关的教学资源,由于它们是有附加价值的,所以一些网上资源受密码保护。
对于所有的读者,尤其是学生,我们有以下资源:
书中所有Python程序的源代码。
提供给教师的PDF讲义版PPT(每页四张)。
保存所有练习提示的数据库,以练习的编号为索引。
对于使用本书的教师,我们有以下额外的教学辅助资源:
本书练习的答案。
书中所有图形和插图的彩色版本。
PPT和PDF版本的幻灯片,其中PDF版本为每页一张。
PPT是完全可编辑的,教师可根据自己的课程需求进行修改。在教师使用本书作为教材时,所有的在线资源不收取额外费用。
内容和组织
书中各章节的内容循序渐进,适于教学。从Python编程和面向对象设计的基础开始,然后逐渐增加如算法分析和递归之类的基础技术。在本书的主体部分中,我们展示了基本的数据结构和算法,并且包括对内存管理的讨论(也是数据结构的架构基础)。本书的章节安排如下:
第1章 Python入门
第2章 面向对象编程
第3章 算法分析
第4章 递归
第5章 基于数组的序列
第6章 栈、队列和双端队列
第7章 链表
第8章 树
第9章 优先级队列
第10章 映射、哈希表和跳跃表
第11章 搜索树
第12章 排序与选择
第13章 文本处理
第14章 图算法
第15章 内存管理和B树
附录A Python中的字符串
附录B 有用的数学定理
预备知识
我们假设读者至少接触过一种高级语言,如C、C++、Python或Java,可以理解相关高级语言的主要概念,包括:
变量和表达式。
决策结构(if语句和switch语句)。
迭代结构(for循环和while循环)。
函数(无论是过程式方法还是面向对象方法)。
对于已经熟悉这些概念但还不清楚如何在Python中应用的读者,我们建议将第1章作为Python语言的入门。这本书主要讨论数据结构,而不是讲解Python,因此并没有详尽介绍Python。
直到第2章才开始使用Python中的面向对象编程,这一章对于那些Python新手以及熟悉Python但不熟悉面向对象编程的人都是有用的。
就数学背景而言,我们假定读者多少熟悉些高中数学知识。即便如此,在第3章中,我们先讨论了算法分析的7个最重要的功能。若所涉及的内容超出了这7个功能,则作为可选章节,用星号(*)标记。附录B对其他有用的数学定理做了总结,包括初等概率等。
计算机科学课程的设计
为了帮助教师在IEEE/ACM 2013的框架下设计教学课程,下表描述了本书涵盖的知识要点。
知识要点 相关章节
AL/基本分析 第3章,4.2节,12.2.4节
AL/算法策略 12.2.1节,13.2.1节,13.3节,13.4.2节
AL/基本数据结构与算法 4.1.3节,5.5.2节,9.4.1节,9.3节,10.2节,11.1节,13.2节,第12章,第14章的大部分内容
AL/高级数据结构 5.3节,10.4节,11.2~11.6节,12.3.1节,13.5节,14.5节,15.3节
AR/内存系统组织和架构 第15章
DS/集合、关系和功能 10.5.1节,10.5.2节,9.4节
DS/证明技巧 3.4节,4.2节,5.3.2节,9.3.6节,12.4.1节
DS/基础计数 2.4.2节,6.2.2节,12.2.4节,8.2.2节,附录B
DS/图和树 第8章和第14章的大部分内容
DS/离散概率 1.11节,10.2节,10.4.2节,12.3.1节
PL/面向对象编程 本书的大部分内容,特别是第2章以及7.4节、9.5.1节、10.1.3节和11.2节
PL/函数式编程 1.10节
SDF/算法和设计 2.1节,3.3节,12.2.1节
SDF/基本编程概念 第1章,第4章
SDF/基本数据结构 第6章,第7章,附录A,1.2.1节,5.2节,5.4节,9.1节,10.1节
SDF/开发方法 1.7节,2.2节
SE/软件设计 2.1节,2.1.3节