目录
数据结构
3 栈,队列,数组
3.3 栈和队列的应用
3.3.2 栈在表达式求值的应用
3.3.5 队列在计算机系统中的应用
5 树与二叉树
5.1 树的基本概念
5.2 二叉树的概念
5.3 二叉树的遍历和线索二叉树
5.4 树,森林
双亲表示法,孩子表示法,孩子兄弟表示法,
5.5 树与二叉树的运用
5.5.1 哈夫曼树与哈夫曼编码
5.5.2 并查集
5.5.3 错题
6 图
6.3 图的遍历
6.3.1 广度优先搜索(Breadth-First-Search BFS)
6.3.2 深度优先搜索(Depth-First-Search DFS)
6.3.3 图的遍历与连通性
6.3.4 例题
6.4 图的应用
6.4.1 最小生成树【prim普里姆】【Kruskal 克鲁斯卡尔】
6.4.2 最短路径 【Dijkstra迪杰斯特拉】【Floyd弗洛伊德】
6.4.4 拓扑排序
6.4.5 关键路径
7 查找
7.1 查找的基本概念
7.2 顺序查找和折半查找
7.2.1 顺序查找
7.2.2 折半查找(二分查找)
7.2.3 分块查找(索引顺序查找)
7.2.4 习题
7.3 树型查找
7.3.1 二叉排序树
7.3.2 平衡二叉树(AVL)
7.3.4 红黑树
7.4 B树和B+树
7.4.1 B树及其基本操作
7.4.2 B+ 树的基本概念
7.5 散列表
7.5.1散列表的基本概念
7.5.2 散列函数构造方法
7.5.3 处理冲突的方法
7.5.4 散列查找性能分析
8 排序
8.1 排序的基本概念
8.2 插入排序 [适用于基本有序的顺序表和数据量不大的排序表]
8.2.1 直接插入排序
8.2.2 折半插入排序
8.2.3 希尔排序(缩小增量排序)
8.3 交换排序
8.3.1 冒泡排序
8.3.2 快速排序
8.4 选择排序
8.4.1 简单选择排序
8.4.2 堆排序 [堆排序适合关键字较多的情况]
8.5 归并排序和基数排序
8.5.1 归并排序
8.5.2 基数排序
8.6 内部排序算法
8.7 外部排序
8.7.2 外部排序的方法
8.7.3 多路平衡归并与败者树
8.7.4 置换选择排序 (生成初始归并段)
8.7.5 最佳归并树
计算机组成原理
2 数据的表示和运算
2.3 浮点数的表示和运算
2.3.1 浮点数的表示
4 指令系统
4.1 指令格式
4.4.1 指令的基本格式编辑
4.1.2 定长操作码指令格式
4.1.3 扩展操作码指令格式
4.1.1 指令操作类型
4.2 指令的寻址方式
4.2.1 指令寻址和数据寻址
4.2.2 常见的数据寻址方式
4.2.4 习题
4.3 程序的机器级代码表示
4.3.1 常用汇编指令介绍
4.4 CISC和RISC的基本概念
4.4.1 复杂指令系统计算机(CISC)
4.4.2 精简指令系统计算机(RISC)
4.4.3 CISC和RISC的比较
5 中央处理器
5.5 异常和中断机制
5.5.1 异常和中断的基本概念
5.5.2 异常和中断的分类
操作系统
2 进程与线程
2.4 死锁
2.4.1 死锁的概念
2.4.2 死锁预防
2.4.3 死锁避免
2.4.4 死锁检测和解除
2.4.6 习题
计算机网络
3 数据链路层
3.1 数据链路层概述
3.2 数据链路层3个重要问题
3.2.1 封装成帧和透明传输
3.2.2 差错检测
3.2.3 (1)可靠传输的相关基本概念
3.2.3 (2)可靠传输的实现机制 - 停止-等待协议(stop-and-wait SW)
3.2.3 (3)可靠传输的实现机制 - 回退N帧协议(GO-back-N,GBN)
3.2.3 (4)可靠传输的实现机制 - 选择重传协议 Selective Repeat, SR)
3.3 点对点协议PPP
3.4 以太网
3.4.1 网络适配器和MAC地址
3.4.2 (1)CSMA/CD协议的基本原理
3.4.2 (2)共享式以太网的争用期、最小帧长,最大帧长
3.4.2 (3)共享式以太网的退避算法和信道利用率
3.4.3 使用集线器的共享式以太网
3.4.4 在物理层扩展以太网
3.4.5 在数据链路层扩展以太网(1)—— 网桥的主要结构和基本工作原理
3.4.5 在数据链路层扩展以太网(2)—— 透明网
网络层重要协议(ARP,DHCP,ICMP,IGMP)
地址解析协议 ARP 广播出去,单播回来
数据结构
3 栈,队列,数组
3.3 栈和队列的应用
3.3.2 栈在表达式求值的应用
- 后缀表达式 顺序扫描表达式,若该项是操作数,则将其压入栈中;若该项是操作符,则连续从栈中退出两个操作数Y和X,形成运算指令XY,并将计算结果压入栈中。当表达式所有项扫描完成以后,栈顶存放的就是最好的计算结果右图是通过二叉树求解后序表达式
- 也可以直接通过中序表达式直接得到后序表达式 A+B*(C-D)-E/F 第一步:C-D cd- 第二步:B*(C-D) bcd-* 第三步:A+B*(C-D) abcd-*+ 第四步:A+B*(C-D)-E/F abcd-*+ef/-
- 前缀表达式:机器运算,从右向左扫描
- 例题 11【A】12【B】
- PS:中缀表达式不仅依赖运算符的优先级,而且还要处理括号;后缀表达式的运算符在操作数的后面,在后缀表达式中已考虑了运算符的优先级,只有操作数和运算符。将中缀表达式转换为后缀表达式的过程中,栈中需要存放括号,看上图例题11。
3.3.5 队列在计算机系统中的应用
- 解决主机与外部设备之间速度不匹配问题 列如:主机与打印机之间速度不匹配问题,主机把要打印输出的数据依次写入缓冲区中,写满后就暂停输出,转去做其他事情;打印机数据缓冲区所存储的数据就是一个队列。
- 解决多用户引起的资源竞争问题
5 树与二叉树
5.1 树的基本概念
- 树是一种递归的数据结构
- 树适合用于保存具有层次结构的数据
- 度:树中一个结点的孩子个数称为该结点的度,树中结点最大的度数称为该树的度
- 结点的层次:从树根开始定义,树根为第一层,以此类推
- 结点的深度:从根结点开始自顶向下逐层累加
- 结点的高度:从叶结点开始自底向上逐层累加
5.2 二叉树的概念
注意:度为2的树至少有3个结点,二叉树可以为空;度为2 的有序树,孩子的左右次序是无需区分的,二叉树的左右孩子次序是确定的。
满二叉树
- 对于编号为 i 的结点,若有双亲,则其双亲为 ⌊ i / 2 ⌋,若有左孩子,则左孩子为 2i,则右孩子为 2i+1
完全二叉树
- 若 n<=⌊ i / 2 ⌋ ,则结点 i 为分支结点,否则为叶子结点
- 最多只有一个度为1的结点
- 当有偶数个结点时:n1=1 , n0=k , n2=k-1
- 当有奇数个结点时:n1=0 , n0=k , n2=k-1
- 结点 i 所在的树的深度(层次)为: ⌊ log2 (i) ⌋+1
- 具有n 个结点的树的高度为: ⌊ log2 (n) ⌋+1
二叉排序树
- 左子树结点关键字 < 根结点关键字 < 右子树结点关键字
平衡二叉树
- 平衡因子:左子树深度 - 右子树深度 = {0,1,-1}
二叉树的存储结构
- 顺序存储结构:建议从数组下标为1开始存储树中的结点
- 链式存储结构:在含有n个结点的二叉链表中,含有n+1个空链域(每个结点都有左右两个指针,n个结点就有2n个链域,连接n个结点只需n-1条线,即n-1个链域,所以含有n+1个空链域)
https://blog.csdn.net/JiangNan_1002/article/details/127025611?spm=1001.2014.3001.5502https://blog.csdn.net/JiangNan_1002/article/details/127025611?spm=1001.2014.3001.5502
5.3 二叉树的遍历和线索二叉树
二叉树的遍历
- https://blog.csdn.net/JiangNan_1002/article/details/127025611?spm=1001.2014.3001.5502
- 非递归中序遍历 [栈] 低优先级
遍历构造二叉树
- 由二叉树先序遍历和中序遍历可以唯一地确定一棵二叉树
- 由二叉树后序遍历和中序遍历可以唯一地确定一棵二叉树
- 由二叉树层次遍历和中序遍历可以唯一地确定一棵二叉树
线索二叉树
- 扩展:在后续线索二叉树上找后继时需知道双亲结点,即三叉链表作为存储结构 三叉链表与二叉链表的主要区别在于,它的结点比二叉链表的结点多一个指针域,该域用于存储一个指向本结点双亲的指针。
2010.3
2020.42
解析:
(1)使用一颗二叉树保存字符集中各字符的编码,每个编码对应于从根开始到达某叶结点的一条路径,路径长度等于编码位数,路径到达的叶结点中保存该编码对应的字符。
(2)从左至右依次扫描0/1串中的各位。从根开始,根据串中当前位沿当前结点的左子指针或右子指针下移,直到移动到叶结点为止。输出叶结点保存的字符。然后从根开始重复这个过程,直到扫描到0/1串结束,译码结束。
(3)二叉树既可以用于保存各字符的编码,又可用于检测编码是否具有前缀特性。判定编码是否具有前缀特性的过程,也是构建二叉树的过程。初始时,二叉树仅含有根结点,其左子树与右子树均为空。依次读入每个编码C,从左至右扫描C的各位,根据C的当前位(0或1)沿结点的指针(左子指针或右子指针)向下移动,当遇到空指针时,创建新的结点,让空指针指向该新结点并继续移动,沿指针移动的过程中。可能遇到三种情况。
- 若遇到叶结点(非根),则表明不具有前缀特性,返回
- 若处理C的所有位的过程中,均没有创建新的结点,则表明不具有前缀特性,返回
- 若处理C的最后一个编码位时创建了新结点,则继续验证下一个编码,若所有的编码都通过验证,则编码具有前缀特性。
错题 p146
- 二叉树中有两个结点m,n,若m是n的祖先,则使用后序遍历可以找到m到n的路径
- 二叉树是逻辑结构,线索二叉树物理结构(指明了存储结构)ps:对于既指明了逻辑结构,也指明的存储结构的,就是物理结构,不存在“逻辑结构和存储结构”
5.4 树,森林
双亲表示法,孩子表示法,孩子兄弟表示法,
408数据结构学习强化——常见数据结构定义和算法总结_江南江南江南丶的博客-CSDN博客
5.5 树与二叉树的运用
5.5.1 哈夫曼树与哈夫曼编码
- 带权路径长度WPL
- 构造哈夫曼树:每次构造都选择两棵树作为新结点的孩子,因此哈夫曼树中不存在度为1 的结点
- 哈夫曼编码:将每个字符为一个独立的结点,其权值为它出现的频率,构造出相应哈夫曼树所构造的哈夫曼树并不唯一,但其WPL(带权路径长度)一定相同且为最优
5.5.2 并查集
- 并查集的初始化:
- 集合树形表示
- 并查集的应用:【数据结构应用题】打卡表参考文档 (qq.com)
- 并查集的应用优化:
5.5.3 错题
- 哈夫曼树带权路径两种算法:
- 哈夫曼树,非叶结点数
6 图
6.3 图的遍历
6.3.1 广度优先搜索(Breadth-First-Search BFS)
- 广度优先搜索过程与二叉树层次遍历是完全一致的(没有印象建议看一下二叉树层次遍历的代码)。
- 算法性能分析:邻接表,邻接矩阵存储:都需要一个辅助队列,空间复杂度O(V) 邻接表:每个顶点搜索一次O(V),在搜索任意结点的邻接点时,每条边访问一次,O(E),时间复杂度为O(V+E); 邻接矩阵存储:时间复杂度为O(V^2)
- BFS算法求解单源最短路径问题
- 广度优先生成树
6.3.2 深度优先搜索(Depth-First-Search DFS)
- 深度优先搜索类似于树的先序遍历
- DFS算法的性能分析:递归算法,需要借助工作栈,空间复杂度O(V) 邻接表:每个顶点搜索一次O(V),在搜索任意结点的邻接点时,每条边访问一次,O(E),时间复杂度为O(V+E); 邻接矩阵存储:时间复杂度为O(V^2)
- 深度优先生出树/森林
PS:对于同样的图,基于邻接矩阵的遍历所得到的DFS序列和BFS序列是一样的,所以生成树唯一,基于邻接表的遍历所得到的DFS序列和BFS序列是不唯一的,所以生成树不唯一
6.3.3 图的遍历与连通性
6.3.4 例题
6.4 图的应用
6.4.1 最小生成树【prim普里姆】【Kruskal 克鲁斯卡尔】
- 是给定在无向图中求一棵树;一个连通图生成树包含图中所有顶点,并且只含有尽可能少的边;
- 定义:设R为G的所有生成树的集合,若T为R中边的权值之和最小的那颗生成树,则T称为G的最小生成树(Minimum-Spanning-Tree,MST)
- 性质:①当G中各权值互不相等时,G的最小生成树是唯一的,否则,最小生成树不是惟一的,即最小生成树树形不唯一,虽然最小生成树不唯一,但最小生成树的权值之和是唯一的。②因为最小生成树的边数为顶点数减1,所以当无向连通图G的边数比顶点数少1,则G的最小生成树就是它本身。
- Prim(普里姆)算法:时间复杂度O(V^2) 适合用于求解边稠密的图最小生成树
- Kruskal(克鲁斯卡尔)算法 时间复杂度O(ElogE) 适合于边稀疏顶点较多的图
6.4.2 最短路径 【Dijkstra迪杰斯特拉】【Floyd弗洛伊德】
- BFS算法(广度优先搜索)求解单源最短路径问题只是对无权图而言;而当图是带权图时,把一个顶点V0到图中其余任意一个顶点Vi的一条路径(可能不只一条)所经过边上的权值之和,定义为该路径的带权路径长度,把带权路径长度最短的那条路径称为最短路径。
- Dijkstra(迪杰斯特拉)算法求单源最短路径长度 时间复杂度O(V^2) 基本思想:首先从vo出发,vo到v1=10,vo到v4等于5,所以下次判断时,取v4等于5,再看v4可以继续到那些顶点,重复这样,一直到确立完所有的顶点(与prim算法类似)。
- Floyd(弗洛伊德)算法求各顶点之间的最短路径 时间复杂度O(V^3) 空间复杂度O(V^2)
- 最短路径总结
6.4.4 拓扑排序
- AOV网:若用DAG图(有向无环图)表示一个工程,其顶点表示活动,用有向边表示活动 Vi 必须先于活动 Vj 进行的这样一种关系,则将这种有向图称为顶点表示活动图,记为AOV网。
- 拓扑排序定义:拓扑排序是对有向无环图的一种排序,它使得若存在一条从顶点A到顶点B的路径,则在排序中顶点B出现在顶点A后面。每个AOV网都有一个或多个排序序列。
- 对一个AOV网进行拓扑排序的算法:①从AOV网中选择一个没有前驱的顶点输出 ②从网中删除该顶点和所有以它为起点的有向边 ③重复①和②的过程,直到当前的AOV网为空或者当前AOV网中不存在无前驱的顶点为止。后一种情况说明有向图中必有环。
- 时间复杂度: ① 邻接表存储O(V+E) 由于输出每个顶点的同时还要删除以它为起点的边 ②邻接矩阵存储O(V^2)
- 引申:深度遍历实现有向无环图拓扑排序(有时间掌握)
6.4.5 关键路径
- AOE网:在带权有向图中,以顶点表示事件,以有向边表示活动,以边上的权值表示完成该活动的开销(如完成活动所需要的时间),称之为用边表示的网络活动,简称AO网。 PS:AOE网中的边有权值,而AOV网中的边无权值,仅表示顶点之间的前后关系。
- 如上图,第一行(v),最早,每个结点正向最大值。第二行(v),最迟,逆向最小值。
- 从3出发,第一行(l),看结点第一行,最早,正向。第二行(l),看结点第二行,减去当前路径长度、最迟,逆向(倒着往前)。
7 查找
7.1 查找的基本概念
- 查找表(查找结构):①查找某个特定数据元素是否在表中 ②检索满足条件的某个特定的数据的各种元素 ③在查找表中插入数据元素 ④从查找表中删除某个数据元素
- 静态查找表(只涉及上述①②,无需动态地修改查找表)适合的查找方法:顺序查找,折半查找,散列查找等;
- 动态查找(需要动态的插入和删除查找表)适合的查找方法:二叉排序树的查找,散列查找等
- 平均查找长度
7.2 顺序查找和折半查找
7.2.1 顺序查找
- 存储方式:顺序存储结构,链式存储结构
- 一般线性表的顺序查找平均查找长度
- 一般线性表的顺序查找的缺点:当 n 较大时,平均查找长度较大,效率较低
- 一般线性表的顺序查找的优点:对数据存储元素的存储没有要求,顺序存储和链式存储均可。对表中记录的有序性也没有要求,无论记录是否按关键字有序,均可应用。对线性的链表只能进行顺序查找。
- 有序表的顺序查找
7.2.2 折半查找(二分查找)
- 存储结构:折半查找仅适用于有序的顺序存储结构。
- 折半查找代码:
int Binary_Search(SeqList L,ElemType key){
int low,high=L.Tablelen-1,mid;
while(low<=high){
mid=(low+high)/2;
if(key)==mid
cout<
- 折半查找判定树:
7.2.3 分块查找(索引顺序查找)
- 基本思想:将查找表分为若干子块。块内的元素可以是无序的,但块之间是有序的。索引表中的每个元素含有各块的最大关键字和各块中的第一个元素的地址,索引表按关键字有序排列。
- 分块查找示意图:
7.2.4 习题
PS:在算有关于折半查找ASL平均查找长度的问题时,可以先画出查找判定树
解析:查找第一个元素比较 1 次,查找第二个元素比较 2 次,查找三个元素比较 3 次
解析:
7.3 树型查找
红黑树<——二叉排序树——>平衡二叉树
7.3.1 二叉排序树
- 定义:左子树结点值 < 根结点值 < 右子树结点值,所以二叉排序树进行中序遍历
- 二叉排序树查找:从根结点开始,沿某个分支逐层向下比较的过程。
- 二叉树的插入:插入的结点一定是一个新添加的叶结点,且是查找失败时的查找路径上访问的最后一个结点的左孩子和右孩子。
- 二叉树的删除:
- 二叉排序树与二分法:
7.3.2 平衡二叉树(AVL)
- 一定是二叉排序树
- 平衡因子:左子树高度 - 右子树高度 = {0,1,-1}
7.3.4 红黑树
- 性质:①根结点黑色 ②叶结点(虚拟的外部结点、NULL结点、失败结点)都是黑色 ③不红红 ④对每个结点到任一叶结点的简单路径上,所含黑结点数量相同
- 结点数 = 度数+1 n0+n1+n2 = n1+2n2=1 => n0=n2+1
- 红黑树删除操作时间复杂度O(logn),“红黑树”中删除结点的处理方式与“二叉排序树”删除一样,删除破坏特性后要调整
- 一棵红黑树
7.4 B树和B+树
7.4.1 B树及其基本操作
- m叉树特点:①除根结点的所有非叶结点 关键字个数:⌈m/2⌉-1~m-1 子树个数:⌈m/2⌉~m ②根结点至少含有 2 颗子树 ,1 个关键字 ③所有叶结点都在同一层
- B树实例
- B树的高度 与 磁盘存取次数 成正比
- B树的查找:①在B树中找结点 ②在结点内找关键字
- B树的删除 ①直接删除 ②兄弟够借 ③兄弟不够借
7.4.2 B+ 树的基本概念
- B+树是应数据库所需而出现的一种B树的变形树,源于操作系统文件索引,数据索引
- 特点:①结点的子树个数与关键字个数相同,即n个关键字n棵子树 ②相邻叶结点按大小顺序相互链接起来 ③非根内部结点关键字 ⌈m/2⌉~m ④在B+树中,所有非叶结点只起索引作用
- B+树结构示意图
- 总结:
7.5 散列表
7.5.1散列表的基本概念
- 冲突:散列函数可能会把两个或两个以上的不同关键字映射到同一地址,称这种情况为冲突,这些发生碰撞的不同关键词称为同义词
- 散列表:建立了关键字与存储地址的一种直接映射关系
- 理想情况下,对散列表的查找时间复杂度为 O(1)
7.5.2 散列函数构造方法
- 直接定址法
- 除留余数法
- 数字分析法
- 平方取中法
7.5.3 处理冲突的方法
- 开放定址法
- 拉链法(链接法,chaining)
7.5.4 散列查找性能分析
- 平均查找长度
- 查找效率
8 排序
8.1 排序的基本概念
- 排序:就是重新排列表中的元素,使表中的元素满足按关键字有序的过程。
8.2 插入排序 [适用于基本有序的顺序表和数据量不大的排序表]
8.2.1 直接插入排序
- 算法性能分析:①时间复杂度O(n^2) 空间复杂度O(1) ②稳定排序 ③顺序存储,链式存储
- 直接插入排序示例
- 空间复杂度:仅用了常数个辅助单元,O(1)
- 空间复杂度:最好情况(表中元素已经有序,每次一个插入元素,只需比较一次而不用移动元素,O(n))最坏情况(表中元素恰好与排序结果相反,比较次数与移动次数都可达到1+2+3+...+n,O(n^2))
- 稳定:每次插入总是从后向前,所以不会出现相同元素相对位置发生变化的情况,所以是稳定排序
- 适用性:顺序存储,链式存储(可以从前面往后查找进行比较)
8.2.2 折半插入排序
- 算法性能分析:①时间复杂度O(n^2) 空间复杂度O(1) ②稳定排序 ③顺序存储
- 实现方法:在插入过程取每次的中间元素的值(mid),与插入元素(x)比较,如果mid>x,改low=mid+1;反之,midhigh;
- 时间复杂度:折半查找减少了比较元素的次数,约O(nlogn),但元素的移动次数并未发生改变,仍依赖于待排序表的初始状态O(n^2)
- 对数据量不是很大的排序表,折半插入排序往往能表现出很好的性能。
8.2.3 希尔排序(缩小增量排序)
- 算法性能分析:①时间复杂度O(n^2) 空间复杂度O(1) ②顺序存储 ③不稳定排序
- 希尔排序示列:
- 时间复杂度:当n在某个特定范围时,希尔排序时间复杂度约为O(n^1.3)。在最坏情况下希尔的时间复杂度仍为O(n^2),即直接排序。
8.3 交换排序
8.3.1 冒泡排序
- 算法性能分析:①时间复杂度O(n^2) 空间复杂度O(1) ②稳定排序 ③顺序存储 链式存储
- 实现方法:每趟冒泡的结果就是把序列中最小的元素(或最大的元素)放到序列的最终位置...这样最多n-1趟冒泡就能把所有元素排序好
- 时间复杂度:①初始序列有序时,比较次数 n-1,移动次数 0,最好情况下O(n) ②初始序列为逆序时,需要进行 n-1 趟排序,第 i 趟要进行 n-i 次,关键字比较,而且每次比较前后都必须移动元素 3 次来交换元素位置
8.3.2 快速排序
- 算法性能分析:①时间复杂度O(nlogn) 空间复杂度O(logn) ②不稳定排序 ③顺序存储
- 实现过程及代码:
- 空间复杂度:工作栈,最好情况下O(logn),最坏情况下O(n),平均情况下O(logn)
- 时间复杂度:初始基本有序或基本逆序时,最坏时间复杂度O(n^2)。在理想状态下,得到的子区间大小都不可能大于n/2,时间复杂度O(nlogn)。
- 在快速排序算法中,并不产生有序子序列,但每趟排序后会将枢轴(基准)元素放到最终位置上。对所有未确定最终位置的所有元素进行一遍处理称为 “一趟排序” ,因此 “一次划分” 不等于 “一趟排序” ,“一次划分” 可以确定一个元素的最终位置, 而一趟排序也许可以确定多个元素的最终位置。即 “一趟排序” 可由多个已划分的区域组成。
- 题目:运用快排思想
8.4 选择排序
8.4.1 简单选择排序
- 算法性能分析:①时间复杂度O(n^2) 空间复杂度O(1) ②不稳定排序 ③顺序存储 链式存储
- 算法思想:第1趟,选择最小的元素放在第一个位置...第i 趟,选择最小的元素放在第 i 个位置...直到 n-1 趟做完
8.4.2 堆排序 [堆排序适合关键字较多的情况]
- 算法性能分析:①时间复杂度O(nlogn) 空间复杂度O(1) ②不稳定排序 ③顺序存储
- ①初始建堆:从序列的第一个末尾向前调整 ②插入元素:在最后插入元素,再向前调整 ③删除根后:堆的最后一个元素补根,然后在从上向下不断调整
- 时间复杂度:建堆时间O(n),每次调整的时间复杂度O(h),所以时间复杂度O(nlogn)
8.5 归并排序和基数排序
8.5.1 归并排序
- 算法性能分析:①时间复杂度O(nlogn) 空间复杂度O(n) ②稳定排序 ③顺序存储
- 二路归并排序示例
8.5.2 基数排序
- 算法性能分析:①时间复杂度O(d(n+r)) 空间复杂度O(r) ②稳定排序
- 排序方法:①最高位优先法MSD ②最低位优先法LSD
- 基数排序示例:
- 时间复杂度:基数排序需要 d 趟分配和收集,一趟分配需要O(n),一趟收集需要O(r) r是一趟排序所需要的存储空间( r 个队列:r 个队头指针和 r 个队尾指针) 所以基数排序的时间复杂度为O(d(n+r))
- 若n很大,记录的关键字位数较少且可以分解时,采用基数排序比较好
8.6 内部排序算法
当记录本身信息量较大时,为避免耗费大量时间移动,可用链表作为存储结构(直接插入排序,冒泡排序,简单选择排序)
8.7 外部排序
外部排序指排序文件较大,内存一次放不下,需要存放在外存的文件排序
8.7.2 外部排序的方法
- 外部排序通常采用归并排序法
- 增大归并路数,可减少归并趟数,进而减少总的磁盘I/O次数输入/输出缓冲区的作用:暂时输入/输出记录,内部归并工作区,产生初始归并段的工作区
- 一般的,对于 r 个初始归并段,做k路平衡归并,归并树可用严格 k 叉树(即只有度为k,度为0的结点的二叉树) 树的高度-1= ⌈log(k)r⌉ = 归并趟数
8.7.3 多路平衡归并与败者树
- 败者树是一颗完全二叉树
- 使用败者树后,内部归并排序的比较次数与 k 无关,因此,只要内存空间允许,增大归并路数 k 将有效的减少 I/O 次数,提高外部的排序速度。
- 5路归并败者树
8.7.4 置换选择排序 (生成初始归并段)
- ⌈log(k)r⌉ = S归并趟数 ,通过增大初始归并段,来减小r(最开始有r个初始归并段),从而减小S
- 实现方法
8.7.5 最佳归并树
文件经过置换-选择排序之后,得到的是长度不等的初始归并段
计算机组成原理
2 数据的表示和运算
2.3 浮点数的表示和运算
2.3.1 浮点数的表示
- 浮点数
- 浮点数的规格化: 尾数的最高位必须是有效位,为零,可能会损失精度(本来尾数的位数就那么几个,最高位还是0,就很亏,还损失精度)
- IEEE 754标准
- 浮点数的加减运算
- 强制类型转换
4 指令系统
指令系统是计算机的主要属性,位于硬件和软件的交界面上。
4.1 指令格式
4.4.1 指令的基本格式
- 零地址指令
- 一地址指令
- 二地址指令
- 三地址指令
- 四地址指令
4.1.2 定长操作码指令格式
- 定长操作码指令:在指令字的最高位部分分配固定的若干位(定长)表示操作码。
- 优点:简化计算机硬件设计,对提高指令译码和识别速度很有利。
- 缺点:指令数量的增多会占更多的固定位,留给表示操作数的地址位数受限。
4.1.3 扩展操作码指令格式
通常情况下,对使用频率较高的指令分配较短的操作码,对于使用频率较低的指令分配较长的操作码,从而尽可能减少指令译码和分析的时间。
4.1.1 指令操作类型
- 数据传送:寄存器直接的传送(MOV),从内存单元读取数据到CPU寄存器(LOAD),从CPU寄存器写数据到内存单元(STORE)等
- 算术和逻辑运算:加(add),减(sub),乘(nul),除(div),比较(cmp),加一(inc),减一(dec),与(and),或(or),取反(not),异或(xor);
- 移位操作:算法移位,逻辑移位,循环移位等
- 转移操作
- 输入输出操作:这类指令用于完成CPU与外部设备交换数据或传送控制命令及状态信息。
4.2 指令的寻址方式
4.2.1 指令寻址和数据寻址
指令寻址
- 顺序寻址:程序计数器(PC)+1(一个指令字长),自动形成下一条地址
- 跳跃寻址:通过转移类指令实现,所谓跳跃,是指下条指令的地址不由程序计数器PC自动给出,而由本条指令给出下条指令地址的计算方式。①绝对寻址②相对寻址
数据寻址
4.2.2 常见的数据寻址方式
- 隐含寻址
- 立即(数)寻址
- 直接寻址
- 间接寻址
- 寄存器寻址
- 寄存器间接寻址
- 相对寻址
- 基址寻址
- 变址寻址
- 堆栈寻址
- 总结:
4.2.4 习题
解析
解析:
解析:
4.3 程序的机器级代码表示
4.3.1 常用汇编指令介绍
- 相关寄存器
- 常用指令 (1)数据传送指令 栈和堆都是内存块(2)算术和逻辑运算指令(3)控制流指令
4.4 CISC和RISC的基本概念
- 复杂指令系统计算机(CISC):典型采用X86架构,主要用于笔记本,台式机等一条指令完成一个复杂的基本功能
- 精简指令系统计算机(RISC):典型的有ARM,MIPS架构的计算机一条指令完成一个基本“动作”,多条指令组合完成一个复杂的基本功能
4.4.1 复杂指令系统计算机(CISC)
(8) 80-20规律
4.4.2 精简指令系统计算机(RISC)
4.4.3 CISC和RISC的比较
- RISC更能充分利用VLSI(超大规模集成电路)
- RISC更能提高运算速度
- RISC便于设计,可降低成本,提高可靠性
- RISC有利于编译程序代码化
- CISC
- CISC和RISC的对比表
5 中央处理器
5.5 异常和中断机制
现代计算机中都配有完善的异常和中断处理系统,CPU的数据通路中有相应的异常检测和响应逻辑,外设接口中有相应的中断请求和控制逻辑,操作系统中有相应的中断服务程序。这些中断硬件线路和中断服务程序的有机结合,共同完成异常和中断的处理过程。
5.5.1 异常和中断的基本概念
- 异常:是CPU执行一条指令时,由CPU在其内部检测到的,与正在执行的指令相关的同步事件。
- 中断:是一种典型的由外部设备触发的,与当前正在执行的指令无关的异步事件。
5.5.2 异常和中断的分类
异常的分类
异常是由CPU内部产生的意外事件,分为硬件故障中断和程序性异常。硬件故障中断是由硬连线出现异常引起的,如存储器校验错、总线错误等。程序性异常也称软件中断,是指在CPU内部因执行指令而引起的异常事件,如整除0、溢出、断点、单步跟踪、非法指令、栈溢出、地址越界、缺页等。按异常发生的原因和返回方式的不同,可分为故障(Fault),自陷(Trap)、终止(Abort)
- 故障(Fault):返回当前指令或终止进程执行
- 自陷(Trap):返回下一条指令执行
- 终止(Abort):不会返回
中断的分类
中断来自CPU外部,与CPU执行的指令无关的时间引起的中断。包括I/O设备发出的I/O中断(如键盘输入,打印机缺纸等),或发生某种特殊事件(如用户按下Esc键、定时器计数时间到等)。外部I/O设备通过特定的中断请求信号线向CPU发出中断请求,CPU每执行完一条指令就检查中断请求信号线,如果检测到中断请求,则进入中断响应周期。中断可分为可屏蔽中断和不可屏蔽中断。
- 可屏蔽中断
- 不可屏蔽中断
异常与中断响应过程
操作系统
2 进程与线程
2.4 死锁
定义:指多个进程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程将无法向前推进。
2.4.1 死锁的概念
- 死锁:至少是两个进程一起死锁,死锁进程处于阻塞态
- 饥饿:可以只有一个进程饥饿,饥饿进程可能阻塞,可能就绪
- 死循环:可能只有一个进程发生死循环,死循环进程可以上处理机(程序员调用时)
死锁产生的原因:
- 系统资源竞争,通常系统中拥有的不可剥夺资源,其数量不足以满足多个进程运行的需要,使得进程在运行过程中,会因为争夺资源而陷入僵局,如磁带机,打印机等;而对可剥夺资源的竞争不会产生死锁,如内存,扬声器等。
- 进程推进顺序非法
- 信号量使用顺序不当
死锁产生的必要条件:产生死锁必须同时满足以下四个条件,只要其中一个条件不成立,死锁就不会发生。
- 互斥条件:即在一段时间内某资源仅为一个进程所占有,此时若有其他进程请求该资源,则请求进程只能等待。
- 不剥夺条件:进程所获得是资源在未使用完之前,不能被其它进程前行夺走,即只能由获得该资源的进程自己来释放(只能是主动释放)。
- 请求并保持条件:进程已经保持了至少一个资源,但又提出新的资源请求,而该资源已被其它进程所占有,此时请求进程被阻塞,但对自己已获得的资源保持不变。
- 循环等待条件:存在一种进程资源的循环等待链发生死锁一定循环等待,但循环等待未必死锁
死锁的处理策略
2.4.2 死锁预防
需破坏死锁产生的4个必要条件之一
- 破坏互斥条件:操作系统可以采用“SPOOLing技术”把独占设备在逻辑上改造成共享设备,但很多时候都无法破坏互斥条件。且在有的场合应该保持这种互斥性,如打印机等临界资源只能互斥使用。
- 破坏不剥夺条件:当一个已保持了某些不可剥夺资源的进程,请求的新的资源而得不到满足时,它必须释放已经保持的所有资源,待以后需要时再重新申请(可以由操作系统协助,将想要资源强行剥夺,这种方式一般需要考虑各进程的优先级)缺点:①这种策略实现起来比较复杂②释放已获得的资源可能造成前一阶段工作的失效③反复地申请和释放资源会增加系统开销,降低系统吞吐量 适用于:状态易于保持和恢复的资源,如CPU的寄存器及内存资源,一般不能用于打印机之内的资源 如果一直这样,就会导致饥饿
- 破坏请求并保持条件:采用预先分配方法,即进程在运行前一次申请完它所需要的全部资源,在它资源未满足前,不把它投入运行。一旦投入运行,这些资源就一直归它所有,不再提出其它资源请求。缺点:系统资源被严重浪费,有些资源仅在运行初期或者快要结束时才使用 还会导致饥饿
- 破坏循环等待条件:可采用顺序资源分配法,首先给系统中的资源编号,规定每个进程按照编号递增的顺序请求资源,同类资源(即编号相同的资源)一次性申请完缺点:①编号必须相对稳定,这就限制了新类型设备的增加②尽管在为资源编号时已考虑大多数作业实际使用这些资源的顺序,但也经常会发生作业使用资源的顺序与系统规定的顺序不同,造成资源的浪费。③按规定次序申请资源的方法,也必然会给用户编程带来麻烦
2.4.3 死锁避免
在资源动态分配过程中,防止系统进入不安去状态,以避免发生死锁。这种方法所施加的限制条件较弱,可以获得较好的系统性能。
- 系统安全状态:避免死锁的方法中,允许进程动态的申请资源,但系统在进行资源分配之前应先计算此次分配的安全性。若此次分配不会导致系统进入不安全的状态,则允许分配;否则让进程等待。 系统处于不安全状态,未必死锁;但死锁一定处于不安全状态;系统处于安全状态一定不会发生死锁。
- 银行家算法
2.4.4 死锁检测和解除
若系统为进程分配资源时不采取任何措施,则应该提供死锁检测和解除手段
- 资源分配图
- 死锁定理:简化资源分配图可检测系统状态S是否为死锁状态
- 死锁解除如何决定对谁动手?①进程优先级(低)②已执行多长时间(短)③还要多久完成(长)④进程已经使用了多少资源(多)⑤进程是交互式还是批处理式的(批处理式)
2.4.6 习题
解析:解析:
【例题】关于优先权大小的论述中,正确的是(D)。
A、计算型作业的优先权,应高于IO型作业的优先权
B、用户进程的优先权,应高于系统进程的优先权
C、在动态优先权中,随着作业等待时间的增加,其优先权将随之下降
D、在动态优先权中,随着进程执行时间的增加,其优先权降低
解析:优先让I/O繁忙型作业优先运行的话,可以使I/O设备尽早投入工作。从而使资源利用率,系统吞吐量得到提升。系统进程(如接收进程、对换进程、磁盘 I/O 进程)的优先权高于一般用户进程的优先权。对资源需求少的进程应赋予较高的优先权。解析:
要点
- 每种资源只有一个,并出现环路必定导致死锁
- 解除死锁通常不采用的方法是从非死锁进程处抢夺资源
- 只有当进程提出资源申请且全部进程都进入阻塞态时,系统才处于死锁状态
- 对死锁有4种方法:忽略、检测与恢复、避免和预防,每种方法对死锁的处理从宽到严,同时系统并发性由大到小
计算机网络
3 数据链路层
3.1 数据链路层概述
- 数据链路层在网络体系结构中所处的地位
- 链路、数据链路和帧
3.2 数据链路层3个重要问题
3.2.1 封装成帧和透明传输
- 封装成帧:以太网帧首部和尾部没有帧定界标志:
- 透明传输:
- 例题:
3.2.2 差错检测
- 误码的相关概念:
- 奇偶校验:下图是奇校验,偶校验类似
- 循环冗余校验
- 总结:
3.2.3 (1)可靠传输的相关基本概念
- 可靠传输的相关基本概念
3.2.3 (2)可靠传输的实现机制 - 停止-等待协议(stop-and-wait SW)
- 停止等待协议实现原理
- 停止等待协议的信道利用率
- 习题
3.2.3 (3)可靠传输的实现机制 - 回退N帧协议(GO-back-N,GBN)
- 回退N帧协议
- 习题
3.2.3 (4)可靠传输的实现机制 - 选择重传协议 Selective Repeat, SR)
- 选择重传协议
- 习题
3.3 点对点协议PPP
- 点对点ppp协议的概述
- ppp帧格式
- ppp帧的透明传输
3.4 以太网
3.4.1 网络适配器和MAC地址
- 网络适配器
- MAC地址 MAC地址也被称为物理地址,物理地址属于数据链路层范畴字节发送顺序:第1字节——>第6字节 字节内的bit发送顺序:b0——>b1
- 习题
3.4.2 (1)CSMA/CD协议的基本原理
- 习题
- CSMA协议基本原理
3.4.2 (2)共享式以太网的争用期、最小帧长,最大帧长
- 以太网争用期
- 共享以太网的最小帧长与最大帧长
- 习题
3.4.2 (3)共享式以太网的退避算法和信道利用率
- 以太网的退避算法
- 共享以太网信道利用率
- 习题
3.4.3 使用集线器的共享式以太网
- 使用集线器共享的以太网
- 习题
3.4.4 在物理层扩展以太网
- 扩展站点与集线器之间的距离(集线器仅工作在物理层)
3.4.5 在数据链路层扩展以太网(1)—— 网桥的主要结构和基本工作原理
- 网桥在数据链路层扩展以太网
- 网桥主要结构和基本工作原理
3.4.5 在数据链路层扩展以太网(2)—— 透明网
- 透明网桥的转发帧和自学习功能
- 透明网桥的生成树协议STP
4 网络层
4.6 虚拟专用网VPN和网络地址转换NAT
- 虚拟专用网络
- 网络地址转换
- 例题
- DNS,域名(www. ....)-> IP地址
- ARP,IP地址 -> MAC地址
网络层重要协议(ARP,DHCP,ICMP,IGMP)
- MAC地址是网卡决定的,如果不更换网卡,则是固定的。当然,也可通过专用工具进行修改。
- 每个电脑的ip地址都不是固定的,你想配成什么都可以,电脑获取ip地址可以人手工配置,也可以是dhcp服务器分给你的
人手工配的一般是静态的 因为只要人不去改就不会变
dhcp给的一般是动态的,就是你每次开机获取的时候和上一次可能不同,也可能是相同的,因为dhcp服务器可以配置优先下发给你你用过的IP给你
ip地址是网络的 不是电脑的 电脑没ip已经可以用,网络没ip基本就废了除非不用ip协议
地址解析协议 ARP 广播出去,单播回来
动态主机配置协议 DHCP 广播出去,广播回来
网际控制报文协议 ICMP
-
网际组管理协议 / 组播协议 IGMP