第1章 算法------1 1.1 概述------1 1.2 [实例] 二分查找------3 1.3 程序性能与算法分析------5 1.3.1 运行时间------7 1.3.2 占用空间------8 1.4 渐近记号------9 1.5 [技巧] 阶的快速比较*------13 1.5.1 加和型无穷大量阶的比较------14 1.5.2 乘积型无穷大量阶的比较------15 1.5.3 对数型无穷大量阶的比较------16 1.6 习题------18 第2章 抽象数据类型------21 2.1 概述------21 2.2 [实例] 查找问题------22 2.2.1 缺点一: 长度受限制------23 2.2.2 缺点二: 有序则难变------25 2.2.3 缺点三: 查变难两全------26 2.2.4 抽象数据类型视角------27 2.3 集合------28 2.4 功能与实现------30 2.4.1 向量简介------31 2.4.2 有序向量实现------32 2.4.3 无序向量实现------35 2.4.4 对比------38 2.5 [技巧] 组装使用------39 2.6 STL容器一览------41 2.7 设计模式------44 2.7.1 迭代器------44 2.7.2 适配器------45 2.7.3 组合------45 2.8 习题------47 第3章 向量------49 3.1 概述------49 3.2 [使用] vector------49 3.3 vector的实现原理------53 3.4 加倍技术*------54 3.5 [技巧] 物理存储与进制换算------56 3.5.1 一维数组------56 3.5.2 二维数组------56 3.5.3 多维向量------57 3.6 [技巧] 自然数映射与下标------59 3.7 [实例] 矩阵的向量实现------61 3.7.1 矩阵的简易实现------61 3.7.2 稀疏矩阵------64 3.8 习题------67 第4章 递归------71 4.1 概述------71 4.2 [技巧] 递归设计与归纳证明------72 4.3 递归与进程模型------75 4.4 递归算法性能分析------76 4.5 [实例] 排列生成器*------79 4.5.1 利用vector传值实现------81 4.5.2 利用vector引用实现------82 4.6 [实例] 乐高铺砖------84 4.7 习题------89 第5章 栈------91 5.1 概述------91 5.2 [使用] stack------92 5.3 stack的实现原理------94 5.4 [实例] 括号匹配------95 5.5 [实例] 路径搜索------97 5.6 习题------101 第6章 队列------103 6.1 概述------103 6.2 [使用] queue------103 6.3 [技巧] 循环向量设计------104 6.3.1 使用两个位置指示------105 6.3.2 使用计数信息------107 6.3.3 缓冲区------107 6.4 queue的实现原理------110 6.5 [实例] 贾宪三角------112 6.6 [技巧] 排队组织与内蕴次序------115 6.7 习题------116 第7章 链------119 7.1 概述------119 7.2 [使用] list ------120 7.3 [技巧] 用于链接的指针------124 7.3.1 利用指针实现链接功能------124 7.3.2 使用真实链首元素指针------125 7.3.3 使用哑结点解决空链判断问题------127 7.4 链的变种------129 7.4.1 单链------129 7.4.2 单循环链------129 7.4.3 双循环链------129 7.5 list的实现原理------130 7.6 [技巧] 基于归纳的初始条件选取------131 7.7 [实例] 归并排序------133 7.8 习题------137 第8章 二叉树------139 8.1 概述------139 8.2 二叉树与树------140 8.3 [技巧] 二叉树遍历------143 8.4 [技巧] 递归处理二叉树------149 8.5 [实例] 二叉查找树------153 8.5.1 特性------153 8.5.2 查找------154 8.5.3 插入------155 8.5.4 删除------155 8.5.5 迭代器------157 8.5.6 效率------157 8.6 习题------158 第9章 集合------161 9.1 概述------161 9.2 [使用] set与multiset ------162 9.3 [使用] unordered_set与unordered_multiset------165 9.4 [实例] 寻找宝藏------169 9.5 [技巧] 哨兵------171 9.5.1 线性查找中的哨兵------171 9.5.2 二叉查找树中的哨兵------173 9.6 [技巧] 集合与序关系------174 9.6.1 排序------175 9.6.2 中位数------175 9.7 [技巧] 不相交集------176 9.8 习题------183 第10章 优先级队列------185 10.1 概述------185 10.2 [使用] priority_queue------185 10.3 [技巧] 维护最大元------187 10.4 priority_queue的实现原理------190 10.5 [实例] 堆排序------193 10.5.1 数据组织与排序------193 10.5.2 建堆算法------194 10.6 [实例] Huffman编码------196 10.7 习题------204 第11章 图------205 11.1 概述------205 11.2 图的表示------207 11.2.1 邻接矩阵------208 11.2.2 邻接表------209 11.2.3 选用------210 11.3 图类------210 11.4 [技巧] 编号与反向映射------214 11.5 [技巧] DFS和BFS------217 11.5.1 深度优先搜索------218 11.5.2 广度优先搜索------218 11.5.3 若干应用------220 11.6 [实例] 最短路径*------221 11.6.1 Dijkstra算法------221 11.6.2 Bellman-Ford-Moore算法------222 11.6.3 Floyd-Warshall算法------223 11.7 [实例] 最小生成树------224 11.7.1 Kruskal算法------225 11.7.2 Prim算法------226 11.8 习题------228 第12章 实验------229 12.1 多维求和------229 12.1.1 一维部分和------229 12.1.2 实验要求------230 12.1.3 评注与引申------230 12.2 幻方计数------231 12.2.1 排列------231 12.2.2 实验要求------232 12.2.3 评注与引申------233 12.3 随机行走------233 12.3.1 伪随机数生成------233 12.3.2 实验要求------234 12.3.3 评注与引申------236 12.4 纸牌游戏------237 12.4.1 可数集------237 12.4.2 实验要求------238 12.4.3 评注与引申------241 12.5 迷宫生成------242 12.5.1 隔板型迷宫------242 12.5.2 实验要求------243 12.5.3 评注与引申------243 12.6 数据压缩------243 12.6.1 存储数据------243 12.6.2 实验要求------244 12.6.3 评注与引申------244 12.7 会场安排------245 12.7.1 时间格式------245 12.7.2 实验要求------246 12.7.3 评注与引申------246 12.8 排序测试------247 12.8.1 随机置换------247 12.8.2 实验要求------248 12.8.3 评注与引申------249 12.9 大数运算------250 12.9.1 GMP------250 12.9.2 实验要求------251 12.9.3 评注与引申------252 附录A 编程技巧------253 A.1 循环不变式------253 A.2 逻辑表达式优化------255 附录B 代码进阶------263 B.1 计时类------263 B.2 代码整合------264 B.3 动态数组------274 B.4 双循环链*------281 参考文献------297