稀疏矩阵
三元组表
在压缩存放稀疏矩阵的非零元同时,若还存放此非零元所在的行号和列号,则称为三元组表法。
三元组表示法是用一个具有三个数据域的一维数组存储稀疏矩阵,每一行由三个字段组成,分别为该非零元素在稀疏矩阵中的行号、列号和值,按行优先顺序存放。
矩阵运算
稀疏矩阵的转置运算
树的逻辑结构特征是:
树中任一结点都可以有零个或多个直接后继(孩子)结点,但至多只能有一个直接前趋(双亲)结点。
树的基本术语:
结点(Node):
树中的元素。
结点的度(Degree):
结点拥有的子树数。
叶子(Leaf):
度为零的结点,也称端结点。
结点的层次:
从根结点开始算起,根为第一层。
深度(Depth):
树中结点的最大层次数。
孩子(Child):
除根结点外,每个结点都是其前趋结点的孩子
双亲(Parent):
孩子结点的上层结点,称为这些结点的双亲
兄弟(Sibling):
同一双亲的孩子。
森林(Forest):
M棵互不相交的树的集合。
有序树:
每个结点的各子树从左到右的次序不能互换的树称为有序树。
二叉树
二叉树是一种特殊的树型结构,特点是树中每个结点最多只有两棵子树,且子树有左右之分,次序不能颠倒。
•特别要注意:
二叉树不是树的特殊情况。
满二叉树
•特点:
每一层上都含有最大结点数。
完全二叉树
•特点:
除最后一层外,每一层都取最大结点数,
•最后一层结点都集中在该层最左边的若干位置。
(注意与满二叉树的区别)
二叉树的基本性质
•A、二叉树的第i层上至多有2i-1(i1)个结点。
•B、深度为h的二叉树中至多含有2h-1个结点。
•C、若在任意一棵二叉树中,有n0个叶子结点,有n2个度为2的结点,则:
n0=n2+1
树与二叉树的区别树中结点的最大度数没有限制,二叉树结点最大度数为2。
树的结点无左、右之分,二叉树的结点子树有明确的左、右之分。
二叉树的遍历
查找某个结点,或对二叉树中全部结点进行某种处理,就需要遍历。
遍历定义及遍历算法
遍历是指按某条搜索路线寻访树中每个结点,且每个结点只被访问一次。
按先左后右的原则,一般使用三种遍历:
先序遍历(DLR):
访问根结点,按先序遍历左子树,按先序遍历右子树。
中序遍历(LDR):
按中序遍历左子树,访问根结点,按中序遍历右子树。
后序遍历(LRD):
按后序遍历左子树,按后序遍历右子树,访问根结点。
二叉树为空时,执行空操作,即空二叉树已遍历完
若二叉树中各结点的值均不相同,则由二叉树的前序序列和中序序列,或由其后序序列和中序序列均能唯一地确定一棵二叉树,但由前序序列和后序序列却不一定能唯一地确定一棵二叉树。
例:
已知一棵二叉树的前序序列和中序序列分别为前序遍历:
ABCDEFG中序遍历:
CBDAFEG,请画出此二叉树。
思想:
先序遍历中的第一个元素必为二叉树的根结点。
中序遍历中的根结点恰为左、右子树的分界点。
先序遍历:
ABCDEFG中序遍历:
CBDAFEG
练习
(1)已知一棵二叉树的中序序列和后序序列分别为BDCEAFHG和DECBHGFA,请画出此二叉树。
(2)已知一棵二叉树的前序序列和后序序列分别为AB和BA,请画出两棵不同的二叉树。
二叉排序树或是空树,或具有下列性质
其左子树上所有结点的数据值均小于根结点的数据值;
其右子树上所有结点的数据值均大于或等于根结点的数据值;
左子树和右子树又各是一棵二叉排序树
哈夫曼树树的带权路径长度最小的二叉树
树的路径长度结点间的路径长度:
一个结点到另一个结点之间的分支数目。
树的路径长度(PL):
是从树根到树中每一结点的路径长度之和。
树的带权路径长度权就是某结点被赋予的一个实数(这在实际应用中是有某种意义的,比如使用率,数值等)。
结点的带权路径长度:
从该结点到树根之间的路径长度×该结点上的权值。
树的带权路径长度(WPL):
是树中叶子结点的带权路径长度之和。
对相同节点的二叉树,树的带权路径长度最小的二叉树就称为最优二叉树(即哈夫曼树)。
哈夫曼树的构造例:
给定权值{7,5,2,4},构造哈夫曼树。
方法:
(1)由原始数据生成森林;
(2)在森林中选取两棵根结点权值最小的和次小的二叉树作为左右子树构造一棵新的二叉树,其根结点的权值为左右子树根结点权值之和。
(3)将新的二叉树加入到森林F中,去除原两棵权值最小的树;
(4)重复2、3步骤,直至F中只剩一棵树为止。
练习:
给定一组权值w={2,3,8,4,45,7,9}构造关于w的哈夫曼树
图
•图是一种复杂的非线性结构
–顶点:
图中的数据元素
–由两个集合V和E组成,V是顶点的有穷非空集,E是V中顶点之间关系的有穷集
•G=(V,E)图的逻辑结构特征:
就是其结点(顶点)的前趋和后继的个数都是没有限制的,即任意两个结点之间之间都可能相关。
图的基本术语
•权:
与图的边或弧相关的数
•网:
带权的图。
•有向网:
弧上带权的有向图
•顶点的度:
依附于该顶点的边数或弧数。
•出度:
(仅对有向图)以该顶点为尾的弧数。
•入度:
(仅对有向图)以该顶点为头的弧数。
•子图:
简单地说,子图就是原图的一部分
•路径:
从顶点vp到顶点vq的路径是顶点序列(vp,vi1,vi2,…,vik,vq),且(vp,vi1),(vi1,vi2),…,(vik,vq)均是E中的边。
路径上边或弧的数目称为该路径的路径长度。
•简单路径:
除起点和终点可以相同外,路径上其余顶点均不相同
•简单回路:
起点和终点相同的简单路径
•连通:
两个不同顶点之间有路径,该两点连通
•连通图:
图中的任意两个不同顶点之间都连通(即有路径),则此图为连通图
•连通分量:
无向图的极大连通子图称为它的连通分量
•强连通分量:
有向图的极大强连通子图称为强连通分量
•图的存储结构——邻接矩阵用一个n(n为顶点数)阶方阵来表示图的结构。
以第i行第j列上的数来表示顶点vi和vj之间是否有边或边的权值。
在无向图中:
•顶点的度数=矩阵中对应该顶点的行或列中非零元素的个数。
在有向图中:
•顶点的出度=矩阵中对应该顶点的行中非零元素的个数。
•顶点的入度=矩阵中对应该顶点的列中非零元素的个数。
•邻接矩阵与邻接表从存储空间角度看,邻接表更适合于表示稀疏图而邻接矩阵适合于表示稠密图。
•从求解相应问题来看,求顶点的度,采用邻接矩阵比邻接表表示更方便。
例:
下面关于图的存储的叙述中,正确的是
A、用邻接表存储图,占用的存储空间大小只与图中结点的个数有关,而与边数无关
B、用邻接表存储图,占用的存储空间大小只与图中边数有关,而与结点个数无关
C、用邻接矩阵存储图,占用的存储空间大小只与图中边数有关,而与结点个数无关
D、用邻接矩阵存储图,占用的存储空间大小只与图中结点的个数有关,而与边数无关
图的遍历
从某一个顶点出发,沿着某条路经对图中其余顶点进行访问,且每个顶点仅被访问一次
深度优先遍历(DFSdepth-firstsearch)
广度优先遍历(BFSbreadth-firstsearch)
深度优先遍历类似于树的先根遍历
•从图的某一顶点V0出发,首先访问起始点V0,然后选择V0的一个尚未访问过的邻接点W,从W出发继续进行深度优先遍历,即选择W的一个尚未访问过的邻接点出发继续进行深度优先遍历,直到被访问的顶点及其邻接点均被访问过为止,
•回溯到该顶点访问前的顶点,继续访问其它尚未访问过的邻接点
•不断回溯,直到起始点V0
•在深度优先遍历中要使用到栈来保存已访问的结点,或保存已访问顶点的所有尚未访问过的邻接点
广度优先遍历类似于树的层次遍历
•在访问了起始点V0后,
•首先依次访问V0的各个邻接点,
•再依次访问这些顶点中未被访问过的邻接点,以此类推
•直到所有被访问到的顶点的邻接点都被访问过为止
•在广度优先遍历中,使用到了队列来保存已访问过的顶点。
两个顶点间长度最短的路径,不是指路径上边数的总和,而是指路径上各边权值的总和。
注意:
路径是一个结点序列,路径的长度是其权值的和,称为距离,所以最短路径长度就是最短距离
单源最短路径:
图中某结点到其他各结点的最短路径
图的应用——拓扑排序
将G中所有顶点排成一个线性序列,使得对图中任一对顶点u和v,若∈E(G)(该有向边在该图的边集中可以找到),则u在线性序列中出现在v之前。
这种线性序列称为拓扑序列。
•拓扑排序方法每次输出一个无前趋的结点并删去此结点及其出边,最后得到的序列即拓扑序列。
•每次输出一个无前趋的结点并删去此结点及其出边,最后得到的序列即拓扑序列。
•拓扑排序是对于有向无环图才可以排序成功的,若图中存在有向环,则该拓扑序列不存在。
Ø下面关于图的存储的叙述中,正确的是。
A、用邻接表存储图,占用的存储空间大小只与图中结点的个数有关,而与边数无关
B、用邻接表存储图,占用的存储空间大小只与图中边数有关,而与结点个数无关
C、用邻接矩阵存储图,占用的存储空间大小只与图中边数有关,而与结点个数无关
D、用邻接矩阵存储图,占用的存储空间大小只与图中结点的个数有关,而与边数无关
Ø__________的邻接矩阵是对称的。
A、有向图B、AOV网C、无向图D、AOE网
查找和排序
选择排序
每一趟从待排序的记录中选出关键字最小的记录,顺序存放已排好的子文件的最后(最前),直到全部记录排序完毕。
选择排序——堆排序
堆排序基本思想因为堆顶是最大的数,所以当把一个关键字序列排成一个大根堆时,就很容易地找到最大的数,它就在序列的第一个位置上然后把这个最大的数与最后一个记录交换,这时,最后一个记录就是关键字最大的记录了。
对于剩下的关键字序列,我们仍然把它排成一个大根堆,然后再把第一个记录(当前堆中的堆顶)与当前堆的最后一个记录交换。
这时,在整个序列后面就有了两个有序的关键字(从小到大)。
重复这样的过程,就可以把有序区不断扩大直到全部关键字都进入有序区。
直到排序完成。
堆的构造无序序列r[1:
n]构成的完全二叉树,
从它最后一个非叶子结点(第n/2个元素)开始直到根结点为止,逐步进行调整即可将此完全二叉树构成堆。
调整:
与其左右子树根结点值比较,取其中大的进行交换。
插入排序每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止。
–线性插入排序
–对半插入排序
插入排序
线性插入排序:
基本思想:
从数组的第2号元素开始,顺序从数组中取出元素,并将该元素插入到其左端已排好序的数组的适当位置上。
线性插入排序:
基本思想:
从数组的第2号元素开始,顺序从数组中取出元素,并将该元素插入到其左端已排好序的数组的适当位置上
哨兵(监视哨)有两个作用:
作为临时变量存放R[i](当前要进行比较的关键字)的副本,
在查找循环中用来监视下标变量j是否越界。
交换排序
两两比较待排序记录的关键字,发现两个记录次序相反时即进行交换,直到没有反序的记录为止。
–冒泡排序
–快速排序
交换排序——冒泡排序
思想:
小的浮起,大的沉底。
从左端开始比较。
第一趟:
第1个与第2个比较,大则交换;第2个与第3个比较,大则交换,……关键字最大的记录交换到最后一个位置上;
第二趟:
对前n-1个记录进行同样的操作,关键字次大的记录交换到第n-1个位置上;依次类推,则完成排序。
快速排序(算法思想)
通过一趟排序将待排序列分成两部分,使其中一部分记录的关键字均比另一部分小,再分别对这两部分排序,以达到整个序列有序。
(1)附设两个指针i和j,初值分别指向第一个记录和最后一个记录,设基准值为key=通常取第一个记录的值;
(2)从j所指位置起向前搜索,找到第一个小于基准值的记录与i号记录交换;
(3)从i所指位置起向后搜索,找到第一个大于基准值的记录与j号记录交换
(4)重复
(2)、(3)两步直至i=j为止。
归并排序
归并排序又称为表排序,其含义是将两个有序序列合并成为一个有序序列。
选择排序
基本思想:
"每趟选一排在(前)后"。
简单选择排序:
每一趟从待排序的记录中选出关键字最小的记录,顺序存放已排好的子文件的最后(最前),直到全部记录排序完毕。
堆排序:
堆的定义、堆的构造、堆排序基本思想
由给定的无序序列构造堆
将堆顶元素与堆中最后一个元素交换,
将最后一个元素从堆中删除
将余下的元素构成完全二叉树重新调整成堆
反复进行,直到堆空。
插入排序:
基本思想:
每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止。
线性插入排序
从数组的第2号元素开始,顺序从数组中取出元素,并将该元素插入到其左端已排好序的数组的适当位置上
对半插入排序
在有序区中进行对分查找,以确定插入的位置
交换排序
基本思想:
两两比较反即换。
冒泡排序
第一趟:
第1个与第2个比较,大则交换;第2个与第3个比较,大则交换,……关键字最大的记录交换到最后一个位置上;
第二趟:
对前n-1个记录进行同样的操作,关键字次大的记录交换到第n-1个位置上;
依次类推,则完成排序。
快速排序
通过一趟排序将待排序列分成两部分,使其中一部分记录的关键字均比另一部分小,再分别对这两部分排序,以达到整个序列有序。
如果只想得到1000个元素组成的序列中的前5个最小的元素,用简单选择排序方法最快快速排序方法在要排序的数据已基本有序情况下不利于发挥其长处。
1)有一数列:
97 65 76 13 29 49 58 经过一趟排序后得到:
13 65 76 97 29 49 58 请问使用的是___________方法?
A 简单选择排序 B 冒泡排序
C 线性插入排序 D 快速排序
1)二分查找的效率较高,但要求关键字有序,并且要求表的存储为顺序存储。
2)假定有关键字序列:
80,15,85,25,65,90,5,95,对其进行快速排序的第一趟结果为05,15,65,25,80,90,85,95。
3)在你学过的排序方法中,单链表上难以实现的排序方法有快速排序和堆排序 。
假定有关键字序列:
416213843596573979611583,对其进行堆排序的第一趟结果为
138483796141573962351596
操作系统引论
从一般用户角度来看,操作系统是指控制和管理计算机的软、硬件资源,合理组织计算机的工作流程,方便用户使用计算机系统的程序集合。
从程序员的角度看,操作系统就是一台能够为用户提供高级编程接口、便于使用的虚拟机。
操作系统的发展
•1.手工操作
•2.早期单道批处理系统
•3.执行系统阶段
•4.多道程序系统
手工操作方式这种工作方式有两个主要缺点:
(1)计算机的全部资源(CPU、内存、外部设备等)由一个用户独占。
(2)人工操作、CPU和输入输出设备的工作串行进行。
整个操作过程非常繁琐,计算机工作效率很低。
批处理操作系统早期批处理阶段
1.早期联机批处理
工作特点:
用户一次可以提交多个作业,但系统一次只处理一个作业。
处理完一个作业后,自动调入下一个作业进行处理。
减少人工干预,使计算机自动进行输入、编译和运行程序。
2.早期脱机批处理
脱机技术的实质:
卫星机与主机并行工作,使主机摆脱了慢速的输入、输出操作,即用快速的输入、输出设备(磁带)代替低速设备,减少了输入、输出操作对系统的影响,缓解了外设与主机运行速度不匹配的矛盾。
•执行系统阶段中断机构和通道技术的出现,使得CPU与外设并行工作成为可能。
•各种中断程序以及负责I/O的控制程序称为执行系统
中断:
•中断是外界(如输入、输出设备,通道等)向主机报告信息的一种通信方式,是CPU对系统中随机事件的响应。
多道程序系统阶段
•把内存分成若干部分,把属于同一批的若干个作业调入内存,存放在内存的不同部分。
当一个作业由于等待输入输出操作而使处理机出现空闲时,系统自动进行切换,处理下一个作业。
如果内存空间允许,可大大提高CPU的利用率。
批处理操作系统特点
多道:
多道指某个作业占用CPU,若由于某种原因暂时不用CPU则系统让第二个作业占用CPU
成批处理:
用户自己不能干预自己作业的运行,一旦发现作业错误不能及时改正,并延长开发软件时间,所以适用于成熟的程序。
分时操作系统特点
•多路性
•交互性
•“独占”性
•及时性
实时操作系统主要追求目标:
•对外部请求在严格时间范围内作出反应
•高可靠性
•安全性
•完整性
实时系统必须和先进的技术装备相结合
操作系统功能
1、处理机管理
2、存储管理
3、设备管理
4、文件管理
5、作业管理
操作系统的特征
并发性
共享性
不确定性
虚拟性
操作系统的性能评价
可靠性
方便性
效率
可维护性
可移植性
操作系统的结构分析
整体式结构
层次式结构
虚拟机结构
客户/服务器结构
对象结构
处理器管理
作业的定义
作业是用户在一次算题过程中或一个事务处理中要求计算机系统所做的工作的集合。
作业的组成作业由程序、数据和作业说明书组成。
作业控制块JCB
作业被收容到外存后,系统为每个作业建立一个JCB,它详细记录作业的有关信息
作业的状态
1)提交状态用户向机房提交作业或通过终端键盘将作业输入,其作业所处的状态为提交状态。
2)收容状态作业的全部信息已输入外存储器中并建立JCB表,等待运行,又称后备状态。
3)执行状态作业被调度程序选中后就给它分配必要的资源,并按照作业步的顺序,依次为每个作业步建立对应的主进程,然后将其提交给进程管理模块,由进程调度程序管理并调度执行。
4)完成状态作业执行完毕或出错而中途停止,释放其占用的全部资源,准备退出系统。
进程的概念
一、引入进程概念的原因
二、进程定义
三、进程与程序的区别
Ø引入进程概念的原因单道程序系统下的程序执行具有顺序性、资源独占性(封闭性)、确定性(可再现性)特点。
Ø多道程序系统中程序执行出现新特点:
相互制约性、随机性、资源共享、与速度有关性。
因而:
用程序这个静态的概念来申请使用系统资源已经不合适;
一个程序段或程序,可能对应多个“计算”,程序与“计算”已不具有一一对应关系。
进程定义
进程是一个可并发执行的程序在一个数据集上的一次执行过程。
它是系统分配资源的基本单位。
进程是由程序、数据集和进程控制块三部分组成。
进程与程序的区别
1)进程是一个动态的概念,是执行程序的动态过程。
而程序是一个静态的概念,是进程运行的静态文本。
2)进程能真实地描述并发执行,且具有并发性,而程序没有。
3)一个进程可以执行一个或多个程序。
反之,同一程序也可能由多个进程同时执行。
4)