一.绪论
-
数据项是构成数据元素的不可分割的最小单位
-
数据元素是数据的基本单位
-
数据结构是相互之间存在一种或多种特定关系的数据元素的集合
-
一个数据元素可由若干个数据项组成
-
算法的特性:
- 有穷性
- 确定性
- 可行性
- 输入
- 输出
-
数据结构包括三方面的内容: 逻辑结构、存储结构和数据的运算
- 逻辑结构包括 线性结构和非线性结构
- 线性结构包括 线性表 (一般线性表、栈、队列、串、数组)
- 非线性结构包括 集合、树形结构、图形结构或网状结构
- 逻辑结构包括 线性结构和非线性结构
线性表
栈
-
n个不同元素进栈,出栈元素不同排列的个数为 /(n+1) 其中 m = 2n
-
对于共享栈 top0 + 1 = top1
-
链栈相比于顺序栈的优点
- 链栈的优点是便于多个栈共享存储空间和提高其效率,且不存在栈满的情况
-
将一个递归算法改为对应的非递归算法时,通常需要使用(栈)
-
栈能适用于递归算法,表达式求值以及括号匹配等问题
队列
队列是一种操作受限的线性表,它与栈不同的是,队列中所有的插入操作均限制在表的一端进行,而所有的删除操作均被限制在另一端进行,允许插入的一段称为队尾,允许删除的一段称为队首,队列具有先进先出的特点
循环队列
树
- 树中的结点数等于所有结点的度数加1
- 度为m的树中第i层上至多有m2i-1个结点
- 高度为h的m叉树至多有(mh-1)/(m-1)个结点
- 具有n个结点的m叉树的最小高度为[logm(n(m-1)+1)]
- 什么是树的度? 所有结点度中的最大值
二叉树
- 平衡二叉树(AVL) : 树上任一结点的左子树和右子树的深度之差绝对值不超过1
- 线索二叉树 : 加上线索的二叉树
二叉树的性质
- 非空二叉树上的叶子结点等于度为2的结点数加1,即n0=n2+1
- 非空二叉树上第k层上至多有2k-1个结点
- 高度为h的二叉树至多有2k-1个结点
- 在含有n个结点的二叉链表中,含有n+1个空链域,含有n-1个非空链域
完全二叉树
- 完全二叉树的度为1的结点的个数最多为1个
- 完全二叉树的双亲结点为 [i/2] -> 向下取整
- 具有n个结点的完全二叉树的深度必为[log2n]+1
- 具有n(n>0)个结点的完全二叉树的高度为[log2(n+1)]或[log2n]+1
- 对完全二叉树,若从上至下、从左至右编号,则编号为i 的结点,其左孩子编号必为2i,其右孩子编号必为2i+1;其双亲的编号必为i/2。
树的遍历
-
先根遍历的顺序和对应二叉树的先序遍历是一致的
后根遍历的顺序和对应二叉树的中序遍历是一致的
二叉树的遍历
- 若二叉树中各节点的值均不相同,则:
- 由二叉树的前序序列和中序序列,或由其后序序列和中序序列均能唯一地确定一棵二叉树
- 由前序序列和后序序列却不一定能唯一地确定一棵二叉树。
哈夫曼树
-
概念:
- 带权路径长度: 结点到根的路径长度与结点上权的乘积
- 树的带权路径长度: 树中所有叶子结点的带权路径长度之和
- 哈夫曼树: 带权路径长度最小的树
-
一棵有n个叶子结点的Huffman树有(2n-1)个结点
森林的遍历
- 先序遍历: 先根后子树
- 中序遍历: 先子树后根
- 森林的先序遍历序列和对应二叉树的先序遍历顺序是一致的 森林的中序遍历序列和对应二叉树的中序遍历顺序是一致的
二叉排序树
- 向二叉排序树中插入一个新节点时,新结点一定会成为二叉排序树的一个叶子节点
- 二叉排序树删除:若结点有左右两棵子树,则令该结点的直接后继(直接前驱)代替该结点,然后从二叉排序树中删除这个直接后继(直接前驱),就转化成了前两种情况
图
- 网: 带权的图称为网
- 极小连通子图:该子图是G 的连通子图,在该子图中删除任何一条边,子图不再连通。
- 包含图G所有顶点的极小连通子图(n-1条边)
- DFS:深度优先搜索
- BFS:广度优先搜索
最小生成树
Prim(普里姆)算法
- 归并顶点,与边数无关,适于稠密网。
Kruskal(克鲁斯卡尔)算法
- 归并边,适于稀疏网。
最短路径
Dijkstra算法
- 时间复杂度:O(n2)
弗洛伊德算法
- 时间复杂度:O(n3)
图的存储结构
邻接矩阵法
- 特点
- 适合稠密图
邻接表法
-
特点
-
若G为无向图,则所需的存储空间为O(|V| + 2|E|)
若G为有向图,则所需的存储空间为O(|V| + |E|)
-
对于稀疏图,采用邻接表表示能极大地节省空间
-
图的邻接表表示不唯一
-
在有向图的邻接表表示中,求一个给定顶点的出度只需计算其邻接表中的结点个数
-
查找
- 平均搜索长度ASL
顺序表的查找
顺序查找
折半查找
非递归算法
递归算法
性能分析
二叉排序树
- 中序遍历二叉排序树后的结果是一个递增的有序数列
-
二叉排序树插入的结点一定在叶子节点上
-
二叉排序树的删除操作
- 二叉排序树的平衡
哈希查找
排序
插入排序
直接插入排序
折半插入排序
希尔排序
交换排序
冒泡排序
快速排序
- 快速排序最好时间复杂度:nlog2n
- 快速排序最坏时间复杂度:n2