目 录译者序前言第一部分 预备知识第1章 C++程序设计 11.1 引言 11.2 函数与参数 21.2.1 传值参数 21.2.2 模板函数 31.2.3 引用参数 31.2.4 常量引用参数 41.2.5 返回值 41.2.6 递归函数 51.3 动态存储分配 91.3.1 操作符new 91.3.2 一维数组 91.3.3 异常处理 101.3.4 操作符delete 101.3.5 二维数组 101.4 类 131.4.1 类Currency 131.4.2 使用不同的描述方法 181.4.3 操作符重载 201.4.4 引发异常 221.4.5 友元和保护类成员 231.4.6 增加#ifndef, #define和#endif语句 241.5 测试与调试 241.5.1 什么是测试 241.5.2 设计测试数据 261.5.3 调试 281.6 参考及推荐读物 29第2章 程序性能 302.1 引言 302.2 空间复杂性 312.2.1 空间复杂性的组成 312.2.2 举例 352.3 时间复杂性 372.3.1 时间复杂性的组成 372.3.2 操作计数 372.3.3 执行步数 442.4 渐进符号(O、 健?、 o) 552.4.1 大写O符号 562.4.2 椒?582.4.3 符号 592.4.4 小写o符号 602.4.5 特性 602.4.6 复杂性分析举例 612.5 实际复杂性 662.6 性能测量 682.6.1 选择实例的大小 692.6.2 设计测试数据 692.6.3 进行实验 692.7 参考及推荐读物 74第二部分 数据结构第3章 数据描述 753.1 引言 753.2 线性表 763.3 公式化描述 773.3.1 基本概念 773.3.2 异常类NoMem 793.3.3 操作 793.3.4 评价 833.4 链表描述 863.4.1 类ChainNode 和Chain 863.4.2 操作 883.4.3 扩充类Chain 913.4.4 链表遍历器类 923.4.5 循环链表 933.4.6 与公式化描述方法的比较 943.4.7 双向链表 953.4.8 小结 963.5 间接寻址 993.5.1 基本概念 993.5.2 操作 1003.6 模拟指针 1023.6.1 SimSpace的操作 1033.6.2 采用模拟指针的链表 1063.7 描述方法的比较 1103.8 应用 1113.8.1 箱子排序 1113.8.2 基数排序 1163.8.3 等价类 1173.8.4 凸包 1223.9 参考及推荐读物 127第4章 数组和矩阵 1284.1 数组 1284.1.1 抽象数据类型 1284.1.2 C++数组 1294.1.3 行主映射和列主映射 1294.1.4 类Array1D 1314.1.5 类Array2D 1334.2 矩阵 1374.2.1 定义和操作 1374.2.2 类Matrix 1384.3 特殊矩阵 1414.3.1 定义和应用 1414.3.2 对角矩阵 1434.3.3 三对角矩阵 1444.3.4 三角矩阵 1454.3.5 对称矩阵 1464.4 稀疏矩阵 1494.4.1 基本概念 1494.4.2 数组描述 1494.4.3 链表描述 154第5章 堆栈 1615.1 抽象数据类型 1615.2 派生类和继承 1625.3 公式化描述 1635.3.1 Stack的效率 1645.3.2 自定义Stack 1645.4 链表描述 1665.5 应用 1695.5.1 括号匹配 1695.5.2 汉诺塔 1705.5.3 火车车厢重排 1725.5.4 开关盒布线 1765.5.5 离线等价类问题 1785.5.6 迷宫老鼠 1805.6 参考及推荐读物 188第6章 队列 1896.1 抽象数据类型 1896.2 公式化描述 1906.3 链表描述 1946.4 应用 1976.4.1 火车车厢重排 1976.4.2 电路布线 2016.4.3 识别图元 2046.4.4 工厂仿真 2066.5 参考及推荐读物 217第7章 跳表和散列 2187.1 字典 2187.2 线性表描述 2197.3 跳表描述 2227.3.1 理想情况 2227.3.2 插入和删除 2237.3.3 级的分配 2247.3.4 类SkipNode 2247.3.5 类SkipList 2257.3.6 复杂性 2297.4 散列表描述 2297.4.1 理想散列 2297.4.2 线性开型寻址散列 2307.4.3 链表散列 2347.5 应用——文本压缩 2387.5.1 LZW压缩 2397.5.2 LZW压缩的实现 2397.5.3 LZW解压缩 2437.5.4 LZW解压缩的实现 2437.6 参考及推荐读物 247第8章 二叉树和其他树 2488.1 树 2488.2 二叉树 2518.3 二叉树的特性 2528.4 二叉树描述 2538.4.1 公式化描述 2538.4.2 链表描述 2548.5 二叉树常用操作 2568.6 二叉树遍历 2568.7 抽象数据类型BinaryTree 2598.8 类BinaryTree 2608.9 抽象数据类型及类的扩充 2638.9.1 输出 2638.9.2 删除 2648.9.3 计算高度 2648.9.4 统计节点数 2658.10 应用 2658.10.1 设置信号放大器 2658.10.2 在线等价类 2688.11 参考及推荐读物 275第9章 优先队列 2769.1 引言 2769.2 线性表 2779.3 堆 2789.3.1 定义 2789.3.2 最大堆的插入 2799.3.3 最大堆的删除 2799.3.4 最大堆的初始化 2809.3.5 类MaxHeap 2819.4 左高树 2859.4.1 高度与宽度优先的最大及最小左高树 2859.4.2 最大HBLT的插入 2879.4.3 最大HBLT的删除 2879.4.4 合并两棵最大HBLT 2879.4.5 初始化最大HBLT 2899.4.6 类MaxHBLT 2899.5 应用 2939.5.1 堆排序 2939.5.2 机器调度 2949.5.3 霍夫曼编码 2979.6 参考及推荐读物 302第10章 竞?30310.1 引言 30310.2 抽象数据类型WinnerTree 30610.3 类WinnerTree 30710.3.1 定义 30710.3.2 类定义 30710.3.3 构造函数、析构函数及Winner函数 30810.3.4 初始化赢者树 30810.3.5 重新组织比赛 31010.4 输者树 31110.5 应用 31210.5.1 用最先匹配法求解箱子装载问题 31210.5.2 用相邻匹配法求解箱子装载问题 316第11章 搜索树 31911.1 二叉搜索树 32011.1.1 基本概念 32011.1.2 抽象数据类型BSTree和IndexedBSTree 32111.1.3 类BSTree 32211.1.4 搜索 32211.1.5 插入 32311.1.6 删除 32411.1.7 类DBSTree 32611.1.8 二叉搜索树的高度 32711.2 AVL树 32811.2.1 基本概念 32811.2.2 AVL树的高度 32811.2.3 AVL树的描述 32911.2.4 AVL搜索树的搜索 32911.2.5 AVL搜索树的插入 32911.2.6 AVL搜索树的删除 33211.3 红-黑树 33411.3.1 基本概念 33411.3.2 红-黑树的描述 33611.3.3 红-黑树的搜索 33611.3.4 红-黑树的插入 33611.3.5 红-黑树的删除 33911.3.6 实现细节的考虑及复杂性分析 34311.4 B-树 34411.4.1 索引顺序访问方法 34411.4.2 m 叉搜索树 34511.4.3 m 序B-树 34611.4.4 B-树的高度 34711.4.5 B-树的搜索 34811.4.6 B-树的插入 34811.4.7 B-树的删除 35011.4.8 节点结构 35311.5 应用 35411.5.1 直方图 35411.5.2 用最优匹配法求解箱子装载问题 35711.5.3 交叉分布 35911.6 参考及推荐读物 363第12章 图 36512.1 基本概念 36512.2 应用 36612.3 特性 36812.4 抽象数据类型Graph和Digraph 37012.5 无向图和有向图的描述 37112.5.1 邻接矩阵 37112.5.2 邻接压缩表 37312.5.3 邻接链表 37412.6 网络描述 37512.7 类定义 37612.7.1 不同的类 37612.7.2 邻接矩阵类 37712.7.3 扩充Chain类 38012.7.4 类LinkedBase 38112.7.5 链接类 38212.8 图的遍历 38612.8.1 基本概念 38612.8.2 邻接矩阵的遍历函数 38712.8.3 邻接链表的遍历函数 38812.9 语言特性 38912.9.1 虚函数和多态性 38912.9.2 纯虚函数和抽象类 39112.9.3 虚基类 39112.9.4 抽象类和抽象数据类型 39312.10 图的搜索算法 39412.10.1 宽度优先搜索 39412.10.2 类Network 39512.10.3 BFS的实现 39512.10.4 BFS的复杂性分析 39612.10.5 深度优先搜索 39712.11 应用 39912.11.1 寻找路径 39912.11.2 连通图及其构件 40012.11.3 生成树 402第三部分 算法设计方法第13章 贪婪算法 40513.1 最优化问题 40513.2 算法思想 40613.3 应用 40913.3.1 货箱装船 40913.3.2 0/1背包问题 41013.3.3 拓扑排序 41213.3.4 二分覆盖 41513.3.5 单源最短路径 42113.3.6 最小耗费生成树 42413.4 参考及推荐读物 433第14章 分而治之算法 43414.1 算法思想 43414.2 应用 44014.2.1 残缺棋盘 44014.2.2 归并排序 44314.2.3 快速排序 44714.2.4 选择 45214.2.5 距离最近的点对 45414.3 解递归方程 46214.4 复杂性的下限 46314.4.1 最小最大问题的下限 46414.4.2 排序算法的下限 465第15章 动态规划 46715.1 算法思想 46715.2 应用 46915.2.1 0/1背包问题 46915.2.2 图像压缩 47115.2.3 矩阵乘法链 47615.2.4 最短路径 48015.2.5 网络的无交叉子集 48315.2.6 元件折叠 48615.3 参考及推荐读物 491第16章 回溯 49216.1 算法思想 49216.2 应用 49616.2.1 货箱装船 49616.2.2 0/1背包问题 50316.2.3 最大完备子图 50616.2.4 旅行商问题 50816.2.5 电路板排列 510第17章 分枝定界 51617.1 算法思想 51617.2 应用 51917.2.1 货箱装船 51917.2.2 0/1背包问题 52617.2.3 最大完备子图 52817.2.4 旅行商问题 52917.2.5 电路板排列 532 一维数组 91.3.3 异常处理 101.3.4 操作符delete 101.3.5 二维数组 101.4 类 131.4.1 类Currency 131.4.2 使用不同的描述方法 181.4.3 操作符重载 201.4.4 引发异常 221.4.5 友元和保护类成员 231.4.6 增加#ifndef, #define和#endif语句 241.5 测试与调试 241.5.1 什么是测试 241.5.2 设计测试数据 261.5.3 调试 281.6 参考及推荐读物 29第2章 程序性能 302.1 引言 302.2 空间复杂性 312.2.1 空间复杂性的组成 312.2.2 举例 352.3 时间复杂性 372.3.1 时间复杂性的组成 372.3.2 操作计数 372.3.3 执行步数 442.4 渐进符号(O、 健?、 o) 552.4.1 大写O符号 562.4.2 椒?582.4.3 符号 592.4.4 小写o符号 602.4.5 特性 602.4.6 复杂性分析举例 612.5 实际复杂性 662.6 性能测量 682.6.1 选择实例的大小 692.6.2 设计测试数据 692.6.3 进行实验 692.7 参考及推荐读物 74第二部分 数据结构第3章 数据描述 753.1 引言 753.2 线性表 763.3 公式化描述 773.3.1 基本概念 773.3.2 异常类NoMem 793.3.3 操作 793.3.4 评价 833.4 链表描述 863.4.1 类ChainNode 和Chain 863.4.2 操作 883.4.3 扩充类Chain 913.4.4 链表遍历器类 923.4.5 循环链表 933.4.6 与公式化描述方法的比较 943.4.7 双向链表 953.4.8 小结 963.5 间接寻址 993.5.1 基本概念 993.5.2 操作 1003.6 模拟指针 1023.6.1 SimSpace的操作 1033.6.2 采用模拟指针的链表 1063.7 描述方法的比较 1103.8 应用 1113.8.1 箱子排序 1113.8.2 基数排序 1163.8.3 等价类 1173.8.4 凸包 1223.9 参考及推荐读物 127第4章 数组和矩阵 1284.1 数组 1284.1.1 抽象数据类型 1284.1.2 C++数组 1294.1.3 行主映射和列主映射 1294.1.4 类Array1D 1314.1.5 类Array2D 1334.2 矩阵 1374.2.1 定义和操作 1374.2.2 类Matrix 1384.3 特殊矩阵 1414.3.1 定义和应用 1414.3.2 对角矩阵 1434.3.3 三对角矩阵 1444.3.4 三角矩阵 1454.3.5 对称矩阵 1464.4 稀疏矩阵 1494.4.1 基本概念 1494.4.2 数组描述 1494.4.3 链表描述 154第5章 堆栈 1615.1 抽象数据类型 1615.2 派生类和继承 1625.3 公式化描述 1635.3.1 Stack的效率 1645.3.2 自定义Stack 1645.4 链表描述 1665.5 应用 1695.5.1 括号匹配 1695.5.2 汉诺塔 1705.5.3 火车车厢重排 1725.5.4 开关盒布线 1765.5.5 离线等价类问题 1785.5.6 迷宫老鼠 1805.6 参考及推荐读物 188第6章 队列 1896.1 抽象数据类型 1896.2 公式化描述 1906.3 链表描述 1946.4 应用 1976.4.1 火车车厢重排 1976.4.2 电路布线 2016.4.3 识别图元 2046.4.4 工厂仿真 2066.5 参考及推荐读物 217第7章 跳表和散列 2187.1 字典 2187.2 线性表描述 2197.3 跳表描述 2227.3.1 理想情况 2227.3.2 插入和删除 2237.3.3 级的分配 2247.3.4 类SkipNode 2247.3.5 类SkipList 2257.3.6 复杂性 2297.4 散列表描述 2297.4.1 理想散列 2297.4.2 线性开型寻址散列 2307.4.3 链表散列 2347.5 应用——文本压缩 2387.5.1 LZW压缩 2397.5.2 LZW压缩的实现 2397.5.3 LZW解压缩 2437.5.4 LZW解压缩的实现 2437.6 参考及推荐读物 247第8章 二叉树和其他树 2488.1 树 2488.2 二叉树 2518.3 二叉树的特性 2528.4 二叉树描述 2538.4.1 公式化描述 2538.4.2 链表描述 2548.5 二叉树常用操作 2568.6 二叉树遍历 2568.7 抽象数据类型BinaryTree 2598.8 类BinaryTree 2608.9 抽象数据类型及类的扩充 2638.9.1 输出 2638.9.2 删除 2648.9.3 计算高度 2648.9.4 统计节点数 2658.10 应用 2658.10.1 设置信号放大器 2658.10.2 在线等价类 2688.11 参考及推荐读物 275第9章 优先队列 2769.1 引言 2769.2 线性表 2779.3 堆 2789.3.1 定义 2789.3.2 最大堆的插入 2799.3.3 最大堆的删除 2799.3.4 最大堆的初始化 2809.3.5 类MaxHeap 2819.4 左高树 2859.4.1 高度与宽度优先的最大及最小左高树 2859.4.2 最大HBLT的插入 2879.4.3 最大HBLT的删除 2879.4.4 合并两棵最大HBLT 2879.4.5 初始化最大HBLT 2899.4.6 类MaxHBLT 2899.5 应用 2939.5.1 堆排序 2939.5.2 机器调度 2949.5.3 霍夫曼编码 2979.6 参考及推荐读物 302第10章 竞?30310.1 引言 30310.2 抽象数据类型WinnerTree 30610.3 类WinnerTree 30710.3.1 定义 30710.3.2 类定义 30710.3.3 构造函数、析构函数及Winner函数 30810.3.4 初始化赢者树 30810.3.5 重新组织比赛 31010.4 输者树 31110.5 应用 31210.5.1 用最先匹配法求解箱子装载问题 31210.5.2 用相邻匹配法求解箱子装载问题 316第11章 搜索树 31911.1 二叉搜索树 32011.1.1 基本概念 32011.1.2 抽象数据类型BSTree和IndexedBSTree 32111.1.3 类BSTree 32211.1.4 搜索 32211.1.5 插入 32311.1.6 删除 32411.1.7 类DBSTree 32611.1.8 二叉搜索树的高度 32711.2 AVL树 32811.2.1 基本概念 32811.2.2 AVL树的高度 32811.2.3 AVL树的描述 32911.2.4 AVL搜索树的搜索 32911.2.5 AVL搜索树的插入 32911.2.6 AVL搜索树的删除 33211.3 红-黑树 33411.3.1 基本概念 33411.3.2 红-黑树的描述 33611.3.3 红-黑树的搜索 33611.3.4 红-黑树的插入 33611.3.5 红-黑树的删除 33911.3.6 实现细节的考虑及复杂性分析 34311.4 B-树 34411.4.1 索引顺序访问方法 34411.4.2 m 叉搜索树 34511.4.3 m 序B-树 34611.4.4 B-树的高度 34711.4.5 B-树的搜索 34811.4.6 B-树的插入 34811.4.7 B-树的删除 35011.4.8 节点结构 35311.5 应用 35411.5.1 直方图 35411.5.2 用最优匹配法求解箱子装载问题 35711.5.3 交叉分布 35911.6 参考及推荐读物 363第12章 图 36512.1 基本概念 36512.2 应用 36612.3 特性 36812.4 抽象数据类型Graph和Digraph 37012.5 无向图和有向图的描述 37112.5.1 邻接矩阵 37112.5.2 邻接压缩表 37312.5.3 邻接链表 37412.6 网络描述 37512.7 类定义 37612.7.1 不同的类 37612.7.2 邻接矩阵类 37712.7.3 扩充Chain类 38012.7.4 类LinkedBase 38112.7.5 链接类 38212.8 图的遍历 38612.8.1 基本概念 38612.8.2 邻接矩阵的遍历函数 38712.8.3 邻接链表的遍历函数 38812.9 语言特性 38912.9.1 虚函数和多态性 38912.9.2 纯虚函数和抽象类 39112.9.3 虚基类 39112.9.4 抽象类和抽象数据类型 39312.10 图的搜索算法 39412.10.1 宽度优先搜索 39412.10.2 类Network 39512.10.3 BFS的实现 39512.10.4 BFS的复杂性分析 39612.10.5 深度优先搜索 39712.11 应用 39912.11.1 寻找路径 39912.11.2 连通图及其构件 40012.11.3 生成树 402第三部分 算法设计方法第13章 贪婪算法 40513.1 最优化问题 40513.2 算法思想 40613.3 应用 40913.3.1 货箱装船 40913.3.2 0/1背包问题 41013.3.3 拓扑排序 41213.3.4 二分覆盖 41513.3.5 单源最短路径 42113.3.6 最小耗费生成树 42413.4 参考及推荐读物 433第14章 分而治之算法 43414.1 算法思想 43414.2 应用 44014.2.1 残缺棋盘 44014.2.2 归并排序 44314.2.3 快速排序 44714.2.4 选择 45214.2.5 距离最近的点对 45414.3 解递归方程 46214.4 复杂性的下限 46314.4.1 最小最大问题的下限 46414.4.2 排序算法的下限 465第15章 动态规划 46715.1 算法思想 46715.2 应用 46915.2.1 0/1背包问题 46915.2.2 图像压缩 47115.2.3 矩阵乘法链 47615.2.4 最短路径 48015.2.5 网络的无交叉子集 48315.2.6 元件折叠 48615.3 参考及推荐读物 491第16章 回溯 49216.1 算法思想 49216.2 应用 49616.2.1 货箱装船 49616.2.2 0/1背包问题 50316.2.3 最大完备子图 50616.2.4 旅行商问题 50816.2.5 电路板排列 510第17章 分枝定界 51617.1 算法思想 51617.2 应用 51917.2.1 货箱装船 51917.2.2 0/1背包问题 52617.2.3 最大完备子图 52817.2.4 旅行商问题 52917.2.5 电路板排列 532