目录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