数据结构复习提纲
- 算法的五个特征
- 设计算法通常应考虑
- 线性表
- 线性表的特性
- 广义表的结构特点
- 树的有关术语
- 二叉树特点
- 满二叉树
- 完全二叉树
- 二叉树的性质
- 二叉树的按层遍历算法
- 等价二叉树
- 等价二叉树
- 树的表示方法
- Huffman树的相关概念
- 内外节点的相关概念
- Huffman树的应用
- 图的定义
- 图的存储结构
- 邻接表的特点
- 生成树
- 最小生成树
- 拓扑排序有关概念
- 拓扑排序特点
- 关键路径有关概念
- 事件的最早发生时间
- 事件的最迟发生时间
- 活动的最早开始时间
- 活动最晚开始时间
- 关键活动
- Dijkstra算法
- Floyed算法
- 静态查找
- 动态查找
- 平衡二叉树
- B-树性质
- m阶B-树非终端结点的特性
- B-树插入操作
- B-树删除操作
- B+树
- 哈希表的有关概念
- 构造哈希函数
- 处理冲突的方法
- 排序的稳定性
- 插入排序
- 快速排序
- 选择排序
- 归并排序
- 基数排序
- 内部排序方法总结
算法的五个特征
有穷性
确定性
可行性
输入
输出
设计算法通常应考虑
正确性
可读性
健壮性
算法效率 时间复杂度
线性表
是n个类型相同数据元素的有限序列
线性表的特性
有限性
相同性
相继性
广义表的结构特点
数据元素间具有相对次序
长度为最外层包含元素的个数
深度为所含括弧的重数
可共享
可递归–递归表深度无限,长度有限
任意非空广义表均可分解为表头和表尾
树的有关术语
结点层:根结点的层定义为1
树的深度:树的最大结点层
结点的度:结点子树的个数
树的度:树中最大的结点的度
叶子结点:度为0的结点
二叉树特点
二叉树每个结点度≤2
左右子树不能颠倒
递归结构
满二叉树
深度为k的二叉树,有2^k-1个结点
完全二叉树
二叉树中所含的n个结点和满二叉树中编号为1至n的结点一一对应
二叉树的性质
1.第i层最多有2^(i-1)个结点
2.深度为k的二叉树最多有2^k-1个结点
3.具有n个结点的完全二叉树的深度为?(log2 n)(向下取整)+1
4.若度数为0的结点数为N0,度数为1的结点数为N1,度数为2的结点数为N2,则N0 = N2 + 1
5.对按层编号的完全二叉树,对其任意一个编号为i的结点,若i = 1,则无双亲结点,否则其双亲结点为(i / 2)(向下取整)
6.n个结点的二叉树中,共有n + 1个空指针域
二叉树的按层遍历算法
类似于广度优先算法
等价二叉树
相同结构
等价二叉树
相同结构及相同数值
树的表示方法
双亲表示法
孩子链表示法
双亲孩子表示法(邻接表)
孩子兄弟表示法(左指针指向第一个孩子结点,右指针指向右边第一个兄弟结点)
Huffman树的相关概念
结点的路径长度:从根结点到该结点的路径上分支的数目
树的路径长度:树中每个结点的路径长度之和
树的带权路径长度:树中所有叶子结点的带权路径长度之和
内外节点的相关概念
内节点路径长度I:从根结点到每个内结点的路长的总和
外结点路径长度E:从根结点到每个外结点的路长的总和
E = I + 2 * n
Huffman树的应用
决策–成绩系统
图的定义
完全图:含有n*(n - 1)/ 2条边的无向图
有向完全图:含有n*(n - 1)条边的有向图
图的存储结构
邻接矩阵:以1、0表示有无,若有权则表示权值
邻接表:类似树的双亲孩子表示法
邻接表的特点
1.对于顶点多边少的图通常采用邻接表
2.容易找到任意顶点的第一个临街点
3.无向图的边数等于邻接表中边结点数的一半
4.有向图的弧数等于邻接表中的边结点数
生成树
深度优先生成树
广度优先生成树
最小生成树
Prim算法,加入顶点
Kruskal算法,加入边
拓扑排序有关概念
顶点活动网(Activity on vertex netWork – AOV):顶点表示活动,边表示活动间的关系
拓扑序列:先后关系
拓扑排序特点
不唯一性
无环性
可判断有无环
关键路径有关概念
边活动网(Activity on Edge – AOE):顶点表示事件,边表示活动
唯一源点
唯一汇点
关键路径:AOE网中,路径长度最长的路径
关键活动:关键路径上的活动
事件的最早发生时间
ve(j) = 从源点到顶点j的最长路径长度;
(正向找最长)
事件的最迟发生时间
vl(k) = vn的最早发生时间ve(n)-vk到vn的最长路径长度;
(逆向找最长)
活动的最早开始时间
若活动ai是由弧<vk,vj>表示,则活动ai的最早开始时间应等于事件vk的最早发生时间。因此,有:e[i] = ve[k]
活动最晚开始时间
若活动ai是由弧<vk,vj>表示,则活动ai的最晚开始时间应等于事件vj的最迟发生时间减去<vk,vj>的持续时间即l[i]=vl[j]-dut<vk,vj>
关键活动
活动的最早开始时间等于活动的最晚开始时间
Dijkstra算法
找最小距离点,加入,更新路径
Floyed算法
i、j、k三重循环找最小–五行算法
静态查找
顺序查找–从后往前–O(N)
折半查找–O(log2 N)
索引顺序表
动态查找
二叉排序树(BST)–左子树值小于根结点值,右子树值大于根结点值
平衡二叉树()–左右子树高度之差绝对值不超过1的二叉排序树
平衡二叉树
平衡因子(BF):左子树高度减去右子树高度
平衡化处理:
-LL型:顺时针
-RR型:逆时针
-LR型:逆时针、顺时针
-RL型:顺时针、逆时针
B-树性质
树中每个节点最多有m个子树
若根结点不是叶子结点,则至少有两棵子树
除根结点以外的所有非叶结点至少有(m/2)(向上取整)棵子树
所有叶子结点和终端结点都位于同一层
m阶B-树非终端结点的特性
n个关键字
n个指向记录的指针
n+1个指向子树的指针
B-树插入操作
分裂结点–第[m/2]向上取整个数据向上分裂
B-树删除操作
后继替换
合并
分裂
B+树
叶子结点包含了全部关键字信息
所有非终端结点可以看作是索引
哈希表的有关概念
1.哈希函数:又叫做散列函数,是由关键字与记录的存储位置建立的一种函数关系,H(key)
2.哈希地址:由哈希函数得到的存储地址
3.装填因子:若散列表空间大小为n,填入表中的结点数m,则称α = m/n为装填因子
4.冲突:H(K1)= H(K2)
5.同义词:发生冲突的关键字称作同义词
构造哈希函数
1.直接定址法:H(key)=a*key+b
2.数字分析法:取一段
3.平方取中法:以关键字的平方值的中间几位作为存储地址
4.折叠法:左移位叠加和间界叠加
5.除留余数法:Hash ( key ) = key % m
6.除随机数法:H(key) = Random(key)
处理冲突的方法
1.开放地址法
Hi = ( H(key) + di) MOD m i = 1,2,…,k ( k≤m-2 )
di = 1,2,3,……,m-1—线性探测再散列
di = 12,-12,……,±k^2(k ≤m/2)—二次探测再散列
di为伪随机数序列—随即探测再散列
2.双散列函数探测
发生冲突是采用两个散列函数H1(key)和H2(key)
3.链地址法
将所有哈希地址相同的记录都连接在同一链表中
排序的稳定性
在排序过程中,有若干记录的关键字相等,即Ki=Kj(1≤i≤n, 1≤j≤n,i≠j) ,在排序前后,含相等关键字的记录的相对位置保持不变,此即稳定
插入排序
1.直接插入排序:稳定,平均O(n2)
2.折半插入排序:平均O(n*log2 n)
3.表排序:i应在当前位置;p实际在的位置;q表示p的下一个位置
4.希尔排序:跳跃式排序,不稳定,平均O(n1.3~n1.5)
快速排序
1.冒泡排序:稳定,平均O(n2)
2.快速排序:设定枢轴,分成两个序列,两边递归,不稳定,平均O(nlog2 n)
选择排序
1.简单选择排序:筛选最小值,交换。稳定,平均O(n2)
2.树形选择排序:从下往上构建二叉树。稳定,O(nlog2 n)
3.堆排序:交换后建堆。不稳定,O(nlog2 n)
归并排序
二路归并:稳定,O(n*log2 n)
基数排序
按所在位数进相应队列,然后依次出队列,不断重复,直到进行了最大位数这么多次
稳定,O(n)
内部排序方法总结
堆排序、归并排序时间复杂度均为O(nlog2 n);快速排序平均时间复杂度为(nlog2 n);直接插入排序、冒泡排序、简单选择排序平均时间复杂度均为O(n2)