大话数据结构

大话数据结构
内容简介
《大话数据结构》为超级畅销书《大话设计模式》作者程杰潜心三年推出的扛鼎之作!以一个计算机教师教学为场景,讲解数据结构和相关算法的知识。通篇以一种趣味方式来叙述,大量引用了各种各样的生活知识来类比,并充分运用图形语言来体现抽象内容,对数据结构所涉及到的一些经典算法做到逐行分析、多算法比较。与市场上的同类数据结构图书相比,本书内容趣味易读,算法讲解细致深刻,是一本非常适合自学的读物。
作者简介
程杰,一个被读者誉为很适合写 IT 技术书的家伙。《大话设计模式》作者。此书 07 年末出版至今已经简体版印刷 9 次、繁体版印刷 6 次,取得了较好的成绩,开创了一种适合国人阅读的趣味讲解 IT 知识的风格模式。其本人参与过政府、证券、游戏、交通等多种行业的软件开发及项目管理工作,也曾做过软件培训的教师。因曾有过两年半高中数学教学的独特经历,使得其书作当中处处以初学者视角考虑和分析问题,他成为了当前很受欢迎的 IT 技术图书作者之一。
目录
第 1 章 数据结构绪论
- 1.1 开场白
- 1.2 你数据结构怎么学的?
- 1.3 数据结构起源
- 1.4 基本概念和术语
- 1.4.1 数据
- 1.4.2 数据元素
- 1.4.3 数据项
- 1.4.4 数据对象
- 1.4.5 数据结构
- 1.5 逻辑结构与物理结构
- 1.5.1 逻辑结构
- 1.5.2 物理结构
- 1.6 抽象数据类型
- 1.6.1 数据类型
- 1.6.2 抽象数据类型
- 1.7 总结回顾
- 1.8 结尾语
第 2 章 算法
- 2.1 开场白
- 2.2 数据结构与算法关系
- 2.3 两种算法的比较
- 2.4 算法定义
- 2.5 算法的特性
- 2.5.1 输入输出
- 2.5.2 有穷性
- 2.5.3 确定性
- 2.5.4 可行性
- 2.6 算法设计的要求
- 2.6.1 正确性
- 2.6.2 可读性
- 2.6.3 健壮性
- 2.6.4 时间效率高和存储量低
- 2.7 算法效率的度量方法
- 2.7.1 事后统计方法
- 2.7.2 事前分析估算方法
- 2.8 函数的渐近增长
- 2.9 算法时间复杂度
- 2.9.1 算法时间复杂度定义
- 2.9.2 推导大 O 阶方法
- 2.9.3 常数阶
- 2.9.4 线性阶
- 2.9.5 对数阶
- 2.9.6 平方阶
- 2.10 常见的时间复杂度
- 2.11 最坏情况与平均情况
- 2.12 算法空间复杂度
- 2.13 总结回顾
- 2.14 结尾语
第 3 章 线性表
- 3.1 开场白
- 3.2 线性表的定义
- 3.3 线性表的抽象数据类型
- 3.4 线性表的顺序存储结构
- 3.4.1 顺序存储定义
- 3.4.2 顺序存储方式
- 3.4.3 数据长度与线性表长度区别
- 3.4.4 地址计算方法
- 3.5 顺序存储结构的插入与删除
- 3.5.1 获得元素操作
- 3.5.2 插入操作
- 3.5.3 删除操作
- 3.5.4 线性表顺序存储结构的优缺点
- 3.6 线性表的链式存储结构
- 3.6.1 顺序存储结构不足的解决办法
- 3.6.2 线性表链式存储结构定义
- 3.6.3 头指针与头结点的异同
- 3.6.4 线性表链式存储结构代码描述
- 3.7 单链表的读取
- 3.8 单链表的插入与删除
- 3.8.1 单链表的插入
- 3.8.2 单链表的删除
- 3.9 单链表的整表创建
- 3.10 单链表的整表删除
- 3.11 单链表结构与顺序存储结构优缺点
- 3.12 静态链表
- 3.12.1 静态链表的插入操作
- 3.12.2 静态链表的删除操作
- 3.12.3 静态链表优缺点
- 3.13 循环链表
- 3.14 双向链表
- 3.15 总结回顾
- 3.16 结尾语
第 4 章 栈与队列
- 4.1 开场白
- 4.2 栈的定义
- 4.2.1 栈的定义
- 4.2.2 进栈出栈变化形式
- 4.3 栈的抽象数据类型
- 4.4 栈的顺序存储结构及实现
- 4.4.1 栈的顺序存储结构
- 4.4.2 栈的顺序存储结构进栈操作
- 4.4.3 栈的顺序存储结构出栈操作
- 4.5 两栈共享空间
- 4.6 栈的链式存储结构及实现
- 4.6.1 栈的链式存储结构
- 4.6.2 栈的链式存储结构进栈操作
- 4.6.3 栈的链式存储结构出栈操作
- 4.7 栈的作用
- 4.8 栈的应用 – 递归
- 4.8.1 斐波那契数列实现
- 4.8.2 递归定义
- 4.9 栈的应用 – 四则运算表达式求值
- 4.9.1 后缀(逆波兰)表示法定义
- 4.9.2 后缀表达式计算结果
- 4.9.3 中缀表达式转后缀表达式
- 4.10 队列的定义
- 4.11 队列的抽象数据类型
- 4.12 循环队列
- 4.12.1 队列顺序存储的不足
- 4.12.2 循环队列定义
- 4.13 队列的链式存储结构及实现
- 4.13.1 队列链式存储结构入队操作
- 4.13.2 队列链式存储结构出队操作
- 4.14 总结回顾
- 4.15 结尾语
第 5 章 串
- 5.1 开场白
- 05.2 串的定义
- 5.3 串的比较
- 5.4 串的抽象数据类型
- 5.5 串的存储结构
- 5.5.1 串的顺序存储结构
- 5.5.2 串的链式存储结构
- 5.6 朴素的模式匹配算法
- 5.7 KMP 模式匹配算法
- 5.7.1 KMP 模式匹配算法原理
- 5.7.2 next 数组值推导
- 5.7.3 KMP 模式匹配算法实现
- 5.7.4 KMP 模式匹配算法改进
- 5.7.5 nextval 数组值推导
- 5.8 总结回顾
- 5.9 结尾语
第 6 章 树
- 6.1 开场白
- 6.2 树的定义
- 6.2.1 结点分类
- 6.2.2 结点间关系
- 6.2.3 树的其他相关概念
- 6.3 树的抽象数据类型
- 6.4 树的存储结构
- 6.4.1 双亲表示法
- 6.4.2 孩子表示法
- 6.4.3 孩子兄弟表示法
- 6.5 二叉树的定义
- 6.5.1 二叉树特点
- 6.5.2 特殊二叉树
- 6.6 二叉树的性质
- 6.6.1 二叉树性质 1
- 6.6.2 二叉树性质 2
- 6.6.3 二叉树性质 3
- 6.6.4 二叉树性质 4
- 6.6.5 二叉树性质 5
- 6.7 二叉树的存储结构
- 6.7.1 二叉树顺序存储结构
- 6.7.2 二叉链表
- 6.8 遍历二叉树
- 6.8.1 二叉树遍历原理
- 6.8.2 二叉树遍历方法
- 6.8.3 前序遍历算法
- 6.8.4 中序遍历算法
- 6.8.5 后序遍历算法
- 6.8.6 推导遍历结果
- 6.9 二叉树的建立
- 6.10 线索二叉树
- 6.10.1 线索二叉树原理
- 6.10.2 线索二叉树结构实现
- 6.11 树、森林与二叉树的转换
- 6.11.1 树转换为二叉树
- 6.11.2 森林转换为二叉树
- 6.11.3 二叉树转换为树
- 6.11.4 二叉树转换为森林
- 6.11.5 树与森林的遍历
- 6.12 赫夫曼树及其应用
- 6.12.1 赫夫曼树
- 6.12.2 赫夫曼树定义与原理
- 6.12.3 赫夫曼编码
- 6.13 总结回顾
- 6.14 结尾语
第 7 章 图
- 7.1 开场白
- 7.2 图的定义
- 7.2.1 各种图定义
- 7.2.2 图的顶点与边间关系
- 7.2.3 连通图相关术语
- 7.2.4 图的定义与术语总结
- 7.3 图的抽象数据类型
- 7.4 图的存储结构
- 7.4.1 邻接矩阵
- 7.4.2 邻接表
- 7.4.3 十字链表
- 7.4.4 邻接多重表
- 7.4.5 边集数组
- 7.5 图的遍历
- 7.5.1 深度优先遍历
- 7.5.2 广度优先遍历
- 7.6 最小生成树
- 7.6.1 普里姆(Prim)算法
- 7.6.2 克鲁斯卡尔(Kruskal)算法
- 7.7 最短路径
- 7.7.1 迪杰斯特拉(Dijkstra)算法
- 7.7.2 弗洛伊德(Floyd)算法
- 7.8 拓扑排序
- 7.8.1 拓扑排序介绍
- 7.8.2 拓扑排序算法
- 7.9 关键路径
- 7.9.1 关键路径算法原理
- 7.9.2 关键路径算法
- 7.10 总结回顾
- 7.11 结尾语
第 8 章 查找
- 8.1 开场白
- 8.2 查找概论
- 8.3 顺序表查找
- 8.3.1 顺序表查找算法
- 8.3.2 顺序表查找优化
- 8.4 有序表查找
- 8.4.1 折半查找
- 8.4.2 插值查找
- 8.4.3 斐波那契查找
- 8.5 线性索引查找
- 8.5.1 稠密索引
- 8.5.2 分块索引
- 8.5.3 倒排索引
- 8.6 二叉排序树
- 8.6.1 二叉排序树查找操作
- 8.6.2 二叉排序树插入操作
- 8.6.3 二叉排序树删除操作
- 8.6.4 二叉排序树总结
- 8.7 平衡二叉树(AVL 树)
- 8.7.1 平衡二叉树实现原理
- 8.7.2 平衡二叉树实现算法
- 8.8 多路查找树(B 树)
- 8.8.1 2-3 树
- 8.8.2 2-3-4 树
- 8.8.3 B 树
- 8.8.4 B+ 树
- 8.9 散列表查找(哈希表)概述
- 8.9.1 散列表查找定义
- 8.9.2 散列表查找步骤
- 8.10 散列函数的构造方法
- 8.10.1 直接定址法
- 8.10.2 数字分析法
- 8.10.3 平方取中法
- 8.10.4 折叠法
- 8.10.5 除留余数法
- 8.10.6 随机数法
- 8.11 处理散列冲突的方法
- 8.11.1 开放定址法
- 8.11.2 再散列函数法
- 8.11.3 链地址法
- 8.11.4 公共溢出区法
- 8.12 散列表查找实现
- 8.12.1 散列表查找算法实现
- 8.12.2 散列表查找性能分析
- 8.13 总结回顾
- 8.14 结尾语
第 9 章 排序
- 9.1 开场白
- 9.2 排序的基本概念与分类
- 9.2.1 排序的稳定性
- 9.2.2 内排序与外排序
- 9.2.3 排序用到的结构与函数
- 9.3 冒泡排序
- 9.3.1 最简单排序实现
- 9.3.2 冒泡排序算法
- 9.3.3 冒泡排序优化
- 9.3.4 冒泡排序复杂度分析
- 9.4 简单选择排序
- 9.4.1 简单选择排序算法
- 9.4.2 简单选择排序复杂度分析
- 9.5 直接插入排序
- 9.5.1 直接插入排序算法
- 9.5.2 直接插入排序复杂度分析
- 9.6 希尔排序
- 9.6.1 希尔排序原理
- 9.6.2 希尔排序算法
- 9.6.3 希尔排序复杂度分析
- 9.7 堆 排 序
- 9.7.1 堆排序算法
- 9.7.2 堆排序复杂度分析
- 9.8 归并排序
- 9.8.1 归并排序算法
- 9.8.2 归并排序复杂度分析
- 9.8.3 非递归实现归并排序
- 9.9 快速排序
- 9.9.1 快速排序算法
- 9.9.2 快速排序复杂度分析
- 9.9.3 快速排序优化
- 1.优化选取枢轴
- 2.优化不必要的交换
- 3.优化小数组时的排序方案
- 4.优化递归操作
- 9.10 总结回顾
- 9.11 结尾语
- 附录 参考文献