目录CONTENTS
第1章绪论1
1.1算法和算法分析1
1.1.1什么是算法1
1.1.2算法的时间复杂度及其表示法3
1.2数据结构6
1.2.1数据的逻辑结构6
1.2.2数据的存储结构7
1.2.3数据结构上的操作8
小结8
习题8
第2章Python语言巩固与提高10
2.1一些Python语言操作的时间复杂度10
2.2函数11
2.2.1lambda表达式11
2.2.2高阶函数和闭包12
2.2.3global变量和nonlocal变量13
2.2.4函数参数的默认值14
★2.2.5生成器(电子文档)14
2.3面向对象程序设计15
2.3.1类和对象15
2.3.2对象的比较18
2.3.3迭代器19
2.3.4类的特殊方法21
习题23
第3章线性表26
3.1顺序表26
3.2链表29
3.2.1单链表29
3.2.2循环单链表33
3.2.3双链表33
3.2.4静态链表37
3.3顺序表和链表的选择37
小结38
习题39
第4章枚举与二分法40
4.1枚举40
4.1.1案例: 八皇后问题(P0070)40
4.1.2案例: 特殊密码锁(P0090)41
4.2二分法43
4.2.1案例: 网线主管(P0120)43
★4.2.2案例: 好斗的牛(P0130)45
小结46
习题46
第5章递归和分治49
5.1用递归进行枚举50
5.1.1案例: N皇后问题(P0230)50
5.1.2案例: 全排列(P0240)52
5.2解决用递归形式定义的问题54
5.2.1案例: 波兰表达式(P0250)54
5.2.2案例: 绘制雪花曲线56
5.3用递归进行问题分解56
5.3.1案例: 上台阶(P0260)56
5.3.2案例: 算24(P0270)57
5.3.3案例: 7的倍数取法有多少种(P0290)58
5.4分治59
5.4.1案例: 求排列的逆序数(P0300)59
5.4.2案例: 汉诺塔问题(P0310)61
5.4.3案例: 快速幂62
小结63
习题63
第6章栈和队列65
6.1栈65
6.1.1案例: 括号配对(P0410)65
6.1.2案例: 后序表达式求值(P0420)66
★6.1.3案例: 四则运算表达式求值(P0440)68
6.1.4案例: 合法出栈序列(P0450)69
★★6.2栈和递归的关系(电子文档)71
6.3队列71
6.3.1队列的基本实现71
6.3.2循环队列72
6.3.3Python语句自带的队列(电子文档)75
★★6.3.4案例: 滑动窗口(P0460)75
6.4用链表实现栈和队列77
小结77
习题78
第7章二叉树80
7.1二叉树的概念80
7.2二叉树的性质82
7.3二叉树的表示84
7.3.1用类表示二叉树84
7.3.2用列表表示二叉树85
7.3.3完全二叉树的表示85
7.4二叉树的遍历86
7.4.1二叉树的前序、后序、中序和按层次遍历86
★7.4.2案例: 文本缩进二叉树(P0560)88
7.4.3案例: 根据二叉树前中序序列建树(P0570)90
★★★7.4.4案例: 根据后序表达式建立表达式树(P0580)(电子文档)91
★7.4.5非递归方式遍历二叉树92
★★7.5线索二叉树93
7.6堆96
7.6.1堆的概念96
7.6.2堆的操作97
7.6.3建堆99
7.6.4堆的实现和优先队列99
7.6.5Python中的堆(电子文档)102
7.7哈夫曼树102
7.7.1哈夫曼树的概念和构造102
7.7.2案例: 栅栏修补(P0590)103
7.7.3哈夫曼编码104
小结107
习题108
第8章树、森林和并查集111
8.1树的概念111
8.2树的实现112
8.2.1树的直观表示法112
8.2.2案例: 括号嵌套树(P0740)113
8.2.3树的儿子兄弟表示法114
8.2.4案例: 树转儿子兄弟树(P0750)115
8.2.5树的父结点表示法117
8.3森林117
8.4并查集118
8.4.1并查集的概念和用途118
8.4.2案例: The Suspects疑似病人(P0760)120
小结122
习题122
第9章字符串匹配124
9.1暴力匹配算法124
★★9.2KMP匹配算法125
小结130
习题130
第10章动态规划132
10.1什么是动态规划132
10.2动态规划解题的一般思路136
10.3案例: 简单背包问题(P0880)138
★★10.4案例: 不简单的出栈序列统计(P0890)140
★10.5案例: 最长上升子序列(P0900)142
★★10.6案例: 最长公共子序列(P0910)(电子文档)143
小结144
习题144
第11章图的遍历和搜索146
11.1图的定义和术语146
11.2图的表示148
11.2.1邻接矩阵148
11.2.2邻接表149
11.2.3邻接表和邻接矩阵的对比150
11.3图的遍历151
11.3.1深度优先遍历151
11.3.2案例: 输出无向图深度优先遍历序列(P1020)152
11.3.3案例: 城堡的房间(P1030)155
11.3.4案例: 判断无向图是否连通及是否有回路(P1040)156
11.3.5广度优先遍历158
11.4图的搜索160
11.4.1概述160
11.4.2深度优先搜索162
11.4.3案例: 走迷宫之一(P1050)166
11.4.4案例: 走迷宫之二(P1060)167
11.4.5案例: 走迷宫之三(P1070)167
11.4.6广度优先搜索168
11.4.7案例: 抓住那头牛(P1080)169
11.4.8案例: “走迷宫之三”的广搜解法(P1070)171
★★11.4.9案例: 拯救行动(P1100)172
11.5深搜和广搜的选择174
小结174
习题175
第12章图论基础应用算法178
12.1最短路178
12.1.1单源最短路问题的Dijkstra算法178
12.1.2案例: 简单的糖果分配 (P1220)181
★12.1.3求每对顶点之间最短路的Floyd算法184
★12.1.4案例: 奶牛比赛 (P1230)186
12.2最小生成树188
12.2.1概述188
★★12.2.2最小生成树的性质189
12.2.3Prim算法190
12.2.4Kruskal算法192
★12.2.5案例: 团结真的就是力量(P1235)193
★★12.2.6案例: 北极网络(P1240)196
12.3拓扑排序198
12.3.1拓扑排序的定义和算法198
12.3.2案例: 火星人家族树 (P1250)199
★12.4关键路径201
12.4.1关键路径的定义和算法201
★★12.4.2案例: 火星大工程(P1260)204
小结206
习题206
第13章排序209
13.1插入排序210
13.1.1直接插入排序210
13.1.2折半插入排序213
13.1.3希尔排序213
13.2选择排序214
13.2.1简单选择排序214
13.2.2堆排序215
13.3归并排序217
13.4交换排序220
13.4.1冒泡排序220
13.4.2快速排序221
13.5分配排序224
13.5.1桶排序224
13.5.2计数排序(电子文档)226
13.5.3基数排序226
★13.6外排序228
13.6.1置换选择排序229
13.6.2多路归并和败者树233
小结236
习题237
第14章查找239
14.1线性表查找239
14.1.1顺序查找239
14.1.2二分查找240
14.1.3Python的二分查找库bisect(电子文档)242
14.1.4分块查找242
14.2树表查找243
14.2.1二叉查找树244
★14.2.2平衡二叉树251
★14.2.3红黑树257
★14.2.4外存查找: B树和B+树258
14.3哈希表268
14.3.1哈希函数设计268
14.3.2哈希表的插入和冲突消解271
14.3.3哈希表的删除和查找274
14.3.4哈希表的效率分析275
★★14.3.5Python中的哈希表(电子文档)276
小结276
习题278
附录A北京大学在线程序评测平台OpenJudge使用说明282
参考文献284