在计算机科学中,数据结构是一门进阶性课程,概念抽象,难度较大。Python语言的语法简单,交互性强。用Python来讲解数据结构等主题,比C语言等实现起来更为容易,更为清晰。
《数据结构 Python语言描述》第1章简单介绍了Python语言的基础知识和特性。第2章到第4章对抽象数据类型、数据结构、复杂度分析、数组和线性链表结构进行了详细介绍,第5章和第6章重点介绍了面向对象设计的相关知识、第5章包括接口和实现之间的重点差异、多态以及信息隐藏等内容,第6章主要讲解继承的相关知识,第7章到第9章以栈、队列和列表为代表,介绍了线性集合的相关知识。第10章介绍了各种树结构,第11章讲解了集和字典的相关内容,第12章介绍了图和图处理算法。每章*后,还给出了复习题和案例学习,帮助读者巩固和思考。
《数据结构 Python语言描述》不仅适合高等院校计算机专业师生阅读,也适合对Python感兴趣的读者和程序员阅读。
不管你是程序设计爱好者、计算机专业的学生还是一位专业程序员,本书都是你通过Python编程语言学习面向对象设计和数据结构的不错的入门教程。通过清晰的示例、按部就班的讲解以及众多实用的练习,本书教你通过Python理解并使用数据结构。
● 使用多态和继承来设计集合类;
● 集合接口的多个实现;
● 不同的集合实现的时间 空间代价分析。
Kenneth A .Lambert是华盛顿与李大学的计算机科学教授和系主任。他教授编程课程30 年 ,并且是计算机科学教育的积极研究者。Lambert编著以及与人合著了一共2 5 本教材,包括与Douglas Nance和Thomas Naps编写的一系列C 入门教材,与Martin Osbor ne编写的一系列Java入门教材, 以及一系列Python入门教材。他还是《Easy GUI Progr amming in Python》的作者。
第1章 Python编程基础1
1.1 基本程序要素1
1.1.1 程序和模块1
1.1.2 Python程序示例:猜数字1
1.1.3 编辑、编译并运行
Python程序2
1.1.4 程序注释3
1.1.5 词法元素3
1.1.6 拼写和命名惯例3
1.1.7 语法元素4
1.1.8 字面值4
1.1.9 字符串字面值4
1.1.10 运算符和表达式5
1.1.11 函数调用5
1.1.12 print函数5
1.1.13 input函数5
1.1.14 类型转换函数和
混合模式运算6
1.1.15 可选的和关键字
函数参数6
1.1.16 变量和赋值语句6
1.1.17 Python数据类型7
1.1.18 import语句7
1.1.19 获取关于程序组件
的帮助7
1.2 控制语句8
1.2.1 条件式语句8
1.2.2 使用if __name__ ==
"__main__"9
1.2.3 循环语句10
1.3 字符串及其运算10
1.3.1 运算符10
1.3.2 格式化字符串以便输出11
1.3.3 对象和方法调用13
1.4 内建Python集合及其操作13
1.4.1 列表14
1.4.2 元组14
1.4.3 遍历序列14
1.4.4 字典15
1.4.5 搜索一个值15
1.4.6 对集合应用模式匹配15
1.5 编写新的函数16
1.5.1 函数定义16
1.5.2 递归函数17
1.5.3 嵌套的函数定义19
1.5.4 高阶函数19
1.5.5 使用lambda表达式
创建匿名函数20
1.6 捕获异常20
1.7 文件及其操作21
1.7.1 文本文件的输出22
1.7.2 将数字写入到一个
文本文件22
1.7.3 从文本文件读取文本23
1.7.4 从文件读取数字24
1.7.5 使用pickle读写对象24
1.8 创建新的类25
1.9 编程项目28
第2章 集合概览30
2.1 集合类型30
2.1.1 线性集合30
2.1.2 层级集合31
2.1.3 图集合31
2.1.4 无序集合31
2.1.5 有序集合31
2.1.6 集合类型的分类32
2.2 集合上的操作32
2.3 集合的实现34
2.4 小结35
2.5 复习题35
2.6 编程项目36
第3章 搜索、排序和复杂度分析37
3.1 评估算法的性能37
3.1.1 度量算法的运行时间37
3.1.2 统计指令39
3.1.3 度量算法所使用的内存41
3.1.4 练习3.141
3.2 复杂度分析41
3.2.1 复杂度的阶41
3.2.2 大O表示法43
3.2.3 常量比例的作用43
3.2.4 练习3.243
3.3 搜索算法44
3.3.1 搜索最小值44
3.3.2 顺序搜索一个列表44
3.3.3 最好情况、最坏情况和
平均情况的性能45
3.3.4 有序列表的二叉搜索45
3.3.5 比较数据项47
3.3.6 练习3.348
3.4 基本排序算法48
3.4.1 选择排序48
3.4.2 冒泡排序49
3.4.3 插入排序50
3.4.4 再谈最好情况、最坏情
况和平均情况的性能52
3.4.5 练习3.452
3.5 更快的排序53
3.5.1 快速排序简介53
3.5.2 合并排序56
3.5.3 练习3.559
3.6 指数算法:递归式的
Fibonacci59
3.7 案例学习:算法探查器61
3.7.1 需求61
3.7.2 分析61
3.7.3 设计62
3.7.4 实现(编写代码)63
3.8 小结65
3.9 复习题66
3.10 编程项目67
第4章 数组和链表结构69
4.1 数组数据结构69
4.1.1 随机访问和连续内存71
4.1.2 静态内存和动态内存72
4.1.3 物理大小和逻辑大小72
4.1.4 练习4.173
4.2 数组的操作73
4.2.1 增加数组的大小73
4.2.2 减小数组的大小74
4.2.3 在数组中插入一项74
4.2.4 从数组中删除一项75
4.2.5 复杂度权衡:时间、
空间和数组76
4.2.6 练习4.276
4.3 二维数组77
4.3.1 处理网格77
4.3.2 创建并初始化网格77
4.3.3 定义Grid类78
4.3.4 杂乱的网格和多维数组79
4.3.5 练习4.379
4.4 链表结构80
4.4.1 单链表结构和双链表
结构80
4.4.2 非连续性内存和节点81
4.4.3 定义一个单链表节点类82
4.4.4 使用单链表节点类82
4.4.5 练习4.484
4.5 单链表结构上的操作84
4.5.1 遍历84
4.5.2 搜索85
4.5.3 替换86
4.5.4 在开始处插入86
4.5.5 在末尾插入87
4.5.6 从开始处删除87
4.5.7 从末尾删除88
4.5.8 在任何位置插入89
4.5.9 从任意位置删除90
4.5.10 复杂度权衡:时间、
空间和单链表结构91
4.5.11 练习4.592
4.6 链表的变体92
4.6.1 带有一个哑头节点
的循环链表结构92
4.6.2 双链表结构93
4.6.3 练习4.695
4.7 小结95
4.8 复习题96
4.9 编程项目96
第5章 接口、实现和多态98
5.1 开发接口98
5.1.1 定义包接口98
5.1.2 指定参数和返回值99
5.1.3 构造方法和实现类101
5.1.4 先验条件、后验条件、
异常和文档101
5.1.5 用Python编写接口102
5.1.6 练习5.1103
5.2 开发一个基于数组的实现103
5.2.1 选择并初始化数据
结构103
5.2.2 先完成容易的方法104
5.2.3 完成迭代器105
5.2.4 完成使用迭代器
的方法106
5.2.5 in运算符和__contains__
方法106
5.2.6 完成remove方法107
5.2.7 练习5.2107
5.3 开发一个基于链表的实现107
5.3.1 初始化数据结构108
5.3.2 完成迭代器109
5.3.3 完成clear和add方法109
5.3.4 完成remove方法109
5.3.5 练习5.3110
5.4 两个包实现的运行时性能110
5.5 测试两个包实现111
5.6 用UML图表示包资源112
5.7 小结113
5.8 复习题113
5.9 编程项目114
第6章 继承和抽象类115
6.1 使用继承定制一个已有的类115
6.1.1 已有类的子类化115
6.1.2 再谈__init__方法116
6.1.3 添加新的contains方法117
6.1.4 修改已有的add方法117
6.1.5 ArraySortedBag的运行
时间性能118
6.1.6 Python中的类层级118
6.1.7 练习6.1119
6.2 使用抽象类去除代码冗余性119
6.2.1 设计一个
AbstractBag类119
6.2.2 重新编写AbstractBag
中的__init__方法120
6.2.3 修改AbstractBag
的子类120
6.2.4 将AbstractBag中的
__add__方法泛化121
6.3 所有集合的一个抽象类122
6.3.1 将AbstractCollection
整合到集合层级中122
6.3.2 在__eq__方法中使用
两个迭代器123
6.3.3 练习6.2124
6.4 小结124
6.5 复习题124
6.6 编程项目125
第7章 栈127
7.1 栈概览127
7.2 使用栈128
7.2.1 栈接口128
7.2.2 初始化一个栈129
7.2.3 示例应用程序:
匹配括号129
7.2.4 练习7.1131
7.3 栈的3种应用131
7.3.1 计算算术表达式131
7.3.2 计算后缀表达式132
7.3.3 练习7.2133
7.3.4 将中缀表达式转换为
后缀表达式133
7.3.5 练习7.3135
7.3.6 回溯算法135
7.3.7 内存管理137
7.4 栈的实现138
7.4.1 测试驱动程序138
7.4.2 将栈添加到集合层级中139
7.4.3 数组实现140
7.4.4 链表实现141
7.4.5 AbstractStack类的
作用144
7.4.6 两种实现的时间和
空间分析144
7.4.7 练习7.4145
7.5 案例学习:计算后缀表达式145
7.5.1 要求145
7.5.2 分析145
7.5.3 设计148
7.5.4 实现150
7.6 小结153
7.7 复习题153
7.8 编程项目154
第8章 队列156
8.1 队列概览156
8.2 队列接口及其应用157
练习8.1158
8.3 队列的两个应用159
8.3.1 模拟159
8.3.2 轮询CPU调度161
8.3.3 练习8.2161
8.4 队列的实现161
8.4.1 队列的链表实现161
8.4.2 数组实现163
8.4.3 两种实现的时间和
空间复杂度分析164
8.4.4 练习8.3165
8.5 案例学习:模拟超市排队
结账165
8.5.1 要求165
8.5.2 分析165
8.5.3 用户界面166
8.5.4 类及其作用166
8.6 优先队列171
练习8.4175
8.7 案例学习:急症室调度175
8.7.1 需求175
8.7.2 分析175
8.7.3 类176
8.7.4 设计和实现177
8.8 小结179
8.9 复习题179
8.10 编程项目180
第9章 列表182
9.1 概览182
9.2 使用列表183
9.2.1 基于索引的操作183
9.2.2 基于内容的操作183
9.2.3 基于位置的操作184
9.2.4 列表的接口187
9.2.5 练习9.1188
9.3 列表的应用188
9.3.1 堆存储管理188
9.3.2 组织磁盘上的文件189
9.3.3 其他集合的实现190
9.4 列表实现191
9.4.1 AbstractList类的角色191
9.4.2 基于数组的实现192
9.4.3 链表实现194
9.4.4 两种实现的时间和
空间分析196
9.4.5 练习9.2197
9.5 实现列表迭代器197
9.5.1 列表迭代器的角色
和作用197
9.5.2 设置和实例化一个
列表迭代器类198
9.5.3 列表迭代器中的导
航方法199
9.5.4 列表迭代器中的修
改器方法200
9.5.5 链表列表的列表迭
代器的设计201
9.5.6 列表迭代器实现的
时间和空间分析201
9.6 案例学习:开发一个有序
的列表201
9.6.1 要求201
9.6.2 分析202
9.6.3 设计202
9.6.4 实现(代码)204
9.7 小结205
9.8 复习题205
9.9 编程项目206
第10章 树208
10.1 树的概览208
10.1.1 树的术语208
10.1.2 普通的树和二叉树209
10.1.3 树的递归定义210
10.1.4 练习10.1210
10.2 为什么要使用树210
10.3 二叉树的形状211
练习10.2213
10.4 二叉树的3种常见应用213
10.4.1 堆213
10.4.2 二叉搜索树214
10.4.3 表达式树215
10.4.4 练习10.3216
10.5 二叉树的遍历216
10.5.1 前序遍历216
10.5.2 中序遍历217
10.5.3 后序遍历217
10.5.4 层序遍历217
10.6 开发二叉搜索树217
10.6.1 二叉搜索树接口218
10.6.2 链表实现的数据结构219
10.6.3 二叉搜索树的复杂度
分析223
10.6.4 练习10.4224
10.7 递归的后代解析和编程语言224
10.7.1 语法简介224
10.7.2 在语言中识别、解析
和解释句子226
10.7.3 词法分析和扫描器226
10.7.4 解析策略227
10.8 案例学习:解析和表达式树227
10.8.1 要求227
10.8.2 分析228
10.8.3 节点类的设计和实现228
10.8.4 解析器类的设计和
实现230
10.9 二叉树的数组实现231
练习10.5232
10.10 实现堆232
练习10.6234
10.11 小结234
10.12 复习题235
10.13 编程项目236
第11章 集和字典238
11.1 使用集238
11.2 Python的set类239
11.2.1 集的一个示例会话239
11.2.2 集的应用240
11.2.3 集和包的关系240
11.2.4 集和字典的关系240
11.2.5 集的实现240
11.2.6 练习11.1241
11.3 集的基于数组和链表的实现241
11.3.1 AbstractSet类241
11.3.2 ArraySet类242
11.4 使用字典243
11.5 基于数组和基于链表的
字典实现244
11.5.1 Item类244
11.5.2 AbstractDict类245
11.5.3 ArrayDict类246
11.5.4 集和字典的基于数组
和列表的实现的复杂
度分析247
11.5.5 练习11.2248
11.6 哈希策略248
11.6.1 冲突和密度的关系249
11.6.2 非数字键的哈希250
11.6.3 线性探测251
11.6.4 二次探测252
11.6.5 链化253
11.6.6 复杂度分析253
11.6.7 练习11.3254
11.7 案例学习:探查哈希策略254
11.7.1 需求255
11.7.2 分析255
11.7.3 设计256
11.8 集的哈希实现258
11.9 字典的哈希实现261
练习11.4263
11.10 有序的集和字典263
11.11 小结264
11.12 复习题264
11.13 编程项目265
第12章 图267
12.1 图的术语267
练习12.1269
12.2 为什么使用图270
12.3 图的表示270
12.3.1 相邻矩阵270
12.3.2 邻接表271
12.3.3 两种表示的分析272
12.3.4 运行时间的进一步
考虑272
12.3.5 练习12.2273
12.4 图的遍历273
12.4.1 泛型遍历算法273
12.4.2 广度优先遍历和深度
优先遍历274
12.4.3 图区域275
12.4.4 练习12.3276
12.5 图中的树276
12.5.1 生成树和森林276
12.5.2 最小生成树277
12.5.3 最小生成树的算法277
12.6 拓扑排序279
12.7 最短路径问题279
12.7.1 Dijkstra算法280
12.7.2 初始化步骤280
12.7.3 计算步骤281
12.7.4 无限的表示和用法282
12.7.5 分析282
12.7.6 练习12.4282
12.7.7 Floyd算法283
12.7.8 分析283
12.8 开发一个图集合284
12.8.1 使用图集合的示例284
12.8.2 LinkedDirected-
Graph类285
12.8.3 LinkedVertex类288
12.8.4 LinkedEdge类289
12.9 案例学习:测试图算法290
12.9.1 需求290
12.9.2 分析290
12.9.3 GraphDemoView类和
GraphDemoModel类291
12.9.4 实现(代码)292
12.10 小结295
12.11 复习题296
12.12 编程项目297
附录 供Python程序员使用的
集合框架299