第1章 数据结构与算法概述 1
1.1 引言 1
1.1.1 《数据结构与算法》课程到底研究什么 1
1.1.2 《数据结构与算法》课程介绍 1
1.1.3 为什么要学习《数据结构与算法》课程 2
1.2 基本概念和术语 3
1.2.1 数据 3
1.2.2 数据项 3
1.2.3 数据元素 4
1.2.4 数据对象 4
1.2.5 数据结构 4
1.2.6 数据结构的形式化描述 6
1.2.7 数据的逻辑结构、存储结构与物理结构 7
1.2.8 数据结构实例 7
1.3 算法 9
1.3.1 什么是算法 9
1.3.2 算法的性质 11
1.3.3 算法和程序 12
1.4 算法的表示(描述) 14
1.4.1 自然语言 14
1.4.2 计算机语言 15
1.4.3 图形化工具 16
1.4.4 伪代码 17
1.5 算法设计的准则 19
1.5.1 正确性 19
1.5.2 可读性 20
1.5.3 健壮性 20
1.5.4 效率 21
1.6 算法效率分析 24
1.6.1 事后统计的方法 25
1.6.2 事前分析估算的方法 25
1.6.3 算法的空间复杂度 28
1.7 抽象数据类型 30
阅读材料 32
习题1 35
第2章 顺序存储结构的线性表 39
2.1 基本概念和操作 39
2.1.1 什么是线性表 39
2.1.2 线性表的逻辑结构 40
2.1.3 线性表的基本操作 40
2.1.4 线性表的顺序存储结构 41
2.1.5 线性表的插入与删除操作(算法) 42
2.1.6 顺序表应用举例 45
2.2 堆栈 47
2.2.1 堆栈的定义 47
2.2.2 栈的顺序存储结构与操作(算法) 48
2.2.3 堆栈在算法设计中的应用 51
2.3 队列 63
2.3.1 队列的定义 64
2.3.2 队列的顺序存储结构与操作(算法) 64
2.3.3 循环队列 66
2.3.4 队列应用举例 68
2.4 集合及其运算 71
2.4.1 集合的定义 71
2.4.2 集合运算 72
2.4.3 集合的顺序存储结构和操作实现 72
小结 75
习题2 75
第3章 链式存储结构的线性表 79
3.1 什么是链式存储结构的线性表 79
3.2 线性链表的操作(算法) 82
3.2.1 线性链表的构造 83
3.2.2 求表长 86
3.2.3 查找操作 86
3.2.4 线性链表的插入 87
3.2.5 线性链表的删除 89
3.3 栈的链式存储结构 90
3.4 队列的链式存储结构 92
3.5 循环链表 93
3.6 双向链表 94
3.7 静态链表 95
3.8 链表应用 97
3.9 一元多项式的存储和相加 100
3.10 集合的链式存储结构与操作 103
3.11 顺序表和链表的比较 106
习题3 107
第4章 串 110
4.1 基本概念 111
4.2 串的存储结构 112
4.2.1 顺序存储结构 112
4.2.2 链式存储结构 113
4.3 串的基本操作 113
4.3.1 串复制 114
4.3.2 求字符串的长度 115
4.3.3 字符串连接 115
4.3.4 取子串 115
4.3.5 判断两个字符串是否相等 116
4.3.6 插入字符串 117
4.3.7 删除子串 117
4.3.8 字符串清空 118
4.3.9 判断字符串是否为空 118
4.3.10 字符串比较 118
4.4 串的模式匹配算法 119
4.4.1 模式匹配及其BF算法 119
4.4.2 模式匹配的一种改进算法——KMP算法 120
4.4.3 其他模式匹配算法 124
4.5 串操作应用举例 132
习题4 133
第5章 数组、特殊矩阵与广义表 136
5.1 数组的定义和运算 136
5.1.1 数组的基本概念 136
5.1.2 数组的特点 137
5.2 数组的顺序存储结构 137
5.2.1 一维数组 137
5.2.2 二维数组 138
5.2.3 三维数组 138
5.2.4 n维数组 139
5.3 特殊矩阵的压缩存储与处理 141
5.3.1 基本原则 141
5.3.2 对称矩阵的压缩存储 141
5.3.3 三角矩阵的压缩存储 142
5.3.4 对角矩阵(带状矩阵)的压缩存储 143
5.4 稀疏矩阵 144
5.4.1 稀疏矩阵的三元组表存储 145
5.4.2 稀疏矩阵的转置 145
5.4.3 稀疏矩阵的快速转置算法 147
5.5.4 稀疏矩阵的乘积 148
5.4.5 稀疏矩阵的十字链表存储 151
5.5 广义表 155
5.5.1 广义表的定义 155
5.5.2 广义表的特性 156
5.5.3 广义表的基本操作 156
5.5.4 广义表的存储 157
5.5.5 广义表的基本操作 159
习题5 162
第6章 树与二叉树 166
6.1 基本概念 166
6.1.1 什么是树 166
6.1.2 基本概念和术语 167
6.1.3 树的表示方法 167
6.1.4 树的基本操作 168
6.1.5 树的存储结构 168
6.2 二叉树 173
6.2.1 二叉树的定义 173
6.2.2 二叉树的基本形态 173
6.2.3 两种特殊的二叉树 174
6.2.4 二叉树具有的重要性质 175
6.2.5 二叉树的存储结构 176
6.2.6 二叉树的基本操作 179
6.3 二叉树的遍历 179
6.3.1 二叉树的遍历 179
6.3.2 先序遍历算法 180
6.3.3 中序遍历 181
6.3.4 后序遍历 182
6.3.5 按层次顺序遍历二叉树 183
6.3.6 遍历算法的应用 184
6.4 二叉树其他运算 185
6.4.1 建造二叉树算法 185
6.4.2 求二叉树高度(深度) 186
6.4.3 求二叉树宽度 186
6.4.4 二叉树查找 187
6.4.5 输出一棵二叉树 188
6.4.6 清除一棵二叉树 188
6.5 线索二叉树 189
6.5.1 建立线索树 189
6.5.2 检索结点 191
6.5.3 在线索二叉树上插入一个结点 192
6.6 树与森林 193
6.6.1 树与二叉树的转换 193
6.6.2 森林与二叉树的转换 194
6.6.3 树和森林的遍历 194
6.7 树的应用 197
6.7.1 判定树 197
6.7.2 集合的表示 198
6.7.3 关系等价求等价类问题 199
6.8 二叉排序树 200
6.8.1 二叉排序树的定义 200
6.8.2 二叉排序树的构造 201
6.8.3 二叉排序树的查找 203
6.8.4 二叉排序树的更新 205
6.8.5 二叉排序树的删除 205
6.9 哈夫曼树及其应用 207
6.9.1 基本概念 207
6.9.2 哈夫曼树的构造 208
6.9.3 哈夫曼编码 210
6.9.4 最佳判定过程 211
6.10 平衡二叉树 212
6.10.1 平衡二叉树的引入 212
6.10.2 平衡二叉树的定义 212
6.10.3 最小不平衡二叉树 213
6.10.4 不平衡二叉树的调整方法 214
6.10.5 建立平衡二叉树举例 218
6.10.6 平衡二叉树与二叉排序树比较 219
习题6 220
第7章 图及其应用 223
7.1 基本概念和术语 225
7.1.1 图的定义 225
7.1.2 完全图、稠密图、稀疏图 226
7.1.3 顶点的度 227
7.1.4 子图 227
7.1.5 路径和回路 227
7.1.6 连通和连通分量 227
7.1.7 强连通图和强连通分量 227
7.1.8 权和网 228
7.2 图的存储结构 229
7.2.1 邻接矩阵 229
7.2.2 邻接表 231
7.2.3 十字链表 234
7.2.4 邻接多重表 236
7.2.5 图的边集数组 237
7.3 图的遍历 237
7.3.1 深度优先搜索 237
7.3.2 广度优先搜索 239
7.3.3 搜索算法在搜索引擎中的应用 242
7.4 图的连通性 243
7.4.1 无向图的连通性 243
7.4.2 有向图的连通性 244
7.4.3 生成树和生成森林 245
7.4.4 关结点和重连通分量 245
7.5 最小生成树 248
7.5.1 什么是生成树 248
7.5.2 构造最小生成树的普里姆(Prim)算法 248
7.5.3 构造最小生成树的Kruskal算法 252
7.6 最短路径 255
7.6.1 求某一个源点到其他顶点的最短路径 256
7.6.2 Bellman-Ford算法 259
7.6.3 每对顶点之间的最短路径 262
7.7 有向无环图及其应用 267
7.7.1 有向无环图的概念 267
7.7.2 AOV网与拓扑排序 268
7.7.3 AOE网与关键路径 272
习题7 277
第8章 查找与搜索引擎 281
8.1 基本概念与术语 281
8.2 顺序查找 283
8.3 二分查找(折半查找) 285
8.3.1 二分查找的定义 285
8.3.2 二分查找算法 286
8.3.3 二分查找判定树 287
8.3.4 二分查找性能分析 287
8.4 有序表的插值查找和斐波那契查找 288
8.4.1 插值查找 288
8.4.2 斐波那契查找 288
8.5 分块查找 289
8.6 B-树和B+树上的查找 291
8.6.1 B-树及其查找 291
8.6.2 B+树 293
8.7 哈希表与散列查找 294
8.7.1 散列的概念 295
8.7.2 哈希函数 295
8.7.3 散列存储的冲突 298
8.7.4 装填因子 298
8.7.5 冲突解决方法 298
8.7.6 散列存储的平均查找长度 302
8.7.7 散列存储的优缺点 303
8.8 搜索引擎及其相关技术 303
8.8.1 网页的自动下载与存储 304
8.8.2 网页索引技术 306
8.8.3 网页排名技术 310
习题8 323
第9章 排序 326
9.1 基本概念 327
9.2 插入排序 327
9.2.1 直接插入排序 327
9.2.2 折半插入排序 329
9.2.3 表插入排序 330
9.2.4 希尔排序 332
9.3 交换排序 336
9.3.1 冒泡排序 336
9.3.2 快速排序 337
9.4 选择排序 343
9.4.1 简单选择排序 343
9.4.2 树形选择排序 346
9.4.3 堆排序 350
9.5 归并排序 356
9.6 分配排序 359
9.6.1 箱排序 359
9.6.2 基数排序 360
9.6.3 多关键字排序 363
9.7 外排序 364
9.7.1 外部排序的方法 364
9.7.2 多路归并的实现 365
9.8 排序方法之比较 368
习题9 369