模拟1清单
模拟1清单
Data Structure
-
- nums栈和ops栈
- scan,若:
- 操作数,入nums栈
- 操作符,如果优先级低于或等于ops栈顶的优先级,则nums弹出两个操作数计算,结果压nums
- 如果优先级比栈顶高,压ops
- 括号的处理:左括号优先级最低,直接压栈;右括号优先级最高,弹出两个nums一个ops计算,loop直到左括号出栈
Sample:\(6\times (2+3\times 7)\times9+8\)
- nums.push(6)
- ops.push(*)
- ops.push('(')
- nums.push(2)
- ops.push(+)
- nums.push(3)
- ops.push('*')# *>+ push and wait
- nums.push(7)
- get ')':
- *=ops.pop()
- 3,7=nums.pop()
- calculate 3*7
- nums.push(21)
- +=ops.pop()
- 2,21=nunms.pop()
- calculate 2+21
- nums.push(23)
- get(,pop and stop loop
- ...
-
出现位置:平衡二叉排序树 当abs(平衡因子)>1时需要进行旋转以保证尽可能为完全二叉树
LL:
新节点插在了左子树的左子树下
处理方法:右旋,左孩子作为新的
root
RR:
新节点插在了右子树的右子树下,处理方法为左旋,
subr=root
LR:
新的节点插在了左子树的右子树下
- 插入43后,导致40为根节点的树失衡(左子树高度为0,右子树高度为2)
- 43插入在右子树的左子树上,将右子树向右旋转一次
- 此时满足了RR,向左旋转一次
- 恢复平衡
即先对左子树做RR,再对总体做LL
RL同.
-
\[h(0)=1,h(1)=1;\\h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0) \ (n\geq2) \]
exp:
- 将栈分为两个部分先后出栈.第一个部分有\(m\)种,第二个部分有\(n\)种.则对于该序列分法,一共有\(mn\)种.
- 对于一个序列长为\(k\)的栈,定位一个成员a,a的上方有i个,下方有j个成员.则有:
- 上方i个序列出完
- 出a
- 下方j个序列
- 这样就是\(h(i)*h(j)\)种.
- 相加,得到上式.注意,a在栈顶/底时,\(h(0)=1\)
-
图的生成树是它的一棵含有其所有顶点的无环连通子图。一幅加权图的最小生成树(Minimum Spanning Tree, MST)是它的一棵权值(树中所有边的权值之和)最小的生成树。
在图论中,无向图的连通分量(或者仅分量)是一个子图,其中任何两个顶点通过路径相互连接,并且在超图中不连接顶点。无向图G的极大连通子图称为G的连通分量( Connected Component)。任何连通图的连通分量只有一个,即是其自身,非连通的无向图有多个连通分量。
在有向图的数学理论中,如果每个顶点都可以从其他顶点到达,则图被称为强连通或不连通。任意有向图的强连通分量或连通分量形成一个划分成本身强连接的子图。可以在线性时间内(即Θ(V + E))测试图的强连通性,或者查找其强连通分量。
人话:
- 联通分量是无向图的极大联通子图,连通图的连通分量是本身,非连通图有多个连通分量(多个division)
- 连通子图:能连通就行.
- 生成树:无环的连通子图
- 最小生成树:权值和最小的生成树
-
- 冒泡:两个数比较大小,较大的数下沉,较小的数冒起来。每一趟固定一个位置。扩展:本趟是否发生交换标记
Flag
O(N^2) - 快排:先从数列中取出一个数作为key值;将比这个数小的数全部放在它的左边,大于或等于它的数全部放在它的右边;对左右两个小数列重复第二步,直至各区间只有1个数。基本思想:分治 O(N*logN)
- 选择:每次遍历,选出最小/大的数和第i个元素交换 O(N^2)
- 插排:在要排序的一组数中,假定前n-1个数已经排好序,现在将第n个数插到前面的有序数列中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。
- 希尔排序:在要排序的一组数中,根据某一增量分为若干子序列,并对子序列分别进行插入排序。然后逐渐将增量减小,并重复上述过程。直至增量为1,此时数据序列基本有序,最后进行插入排序。增量序列一般为10,5,2,1这种\(f(n+1)=f(n)//2\)
- 归并:外部排序O(NlogN)
- 每两个元素比较,形成一个有序子数组
- 每个有序数组合并,形成len=4的有序子数组
- 4,8,16,...所以是logN
- 直到完成排序
- 堆排序:所有序列塞进一个堆,不断弹出堆顶.详细的生成,调整见下面一条.O(NlogN).N个节点*每次调整堆的复杂度logN
- 基数排序:略
- 冒泡:两个数比较大小,较大的数下沉,较小的数冒起来。每一趟固定一个位置。扩展:本趟是否发生交换标记
-
堆的生成就是不断插入调整的结果.
生成: 实际上就是全部塞进去再调整.
- 按照完全二叉树,将数字依次填入。
- 填入后,找到最后一个结点(2),从它的父节点开始调整,根据性质,如果父节点比子节点大,swap
- 注意,被调整的节点,还有子节点的情况,需要递归进行调整。此时以最后一个节点的父节点为根的小顶堆已经调整完成.
- 第二次调整,是数字6的节点数组下标小1的节点(因为是完全二叉树,可以用数组存),用刚才的规则进行调整。以此类推,直到调整到根节点。
插入和调整:
既然是完全二叉树,新成员插入到线性化序列的最末尾位置.依据最小堆的定义,自底向上,递归调整。
堆顶弹出:
对于删除操作,将二叉树的最后一个节点替换到根节点,然后自顶向下,递归调整。
-
- 前序:
- vist
- visitleft
- visitright
- 中序,后序:略
- 层序用Queue,前/中/后序用stack
- 前序:
Circuit
-
在電腦中,算術邏輯單元(ALU)是專門執行算術和邏輯運算的數字電路。
-
我自裁...
-
- 绝对寻址:
JMP ADDR
- PC相对寻址:
JMP OFFSET
PC=PC+OFFSET - 寄存器间接寻址:
JMPVIA REG
PC=[REG]
- 绝对寻址:
-
- 寄存器直接寻址:
MUL REG1 REG2 REG3
REG1=REG2*REG3 - 基址寻址和变种:
LOAD REG BASE OFFSET
REG=MEM[BASE+OFFSET] - 立即寻址:
ADD REG1 REG2 CONSTANT
REG1=REG2+CONSTANT - 隐含寻址:隐含在指令里的默认寻址
- 直接寻址:在指令格式的地址的字段中直接指出操作数在内存的地址.比如:
OP=MEM[A1]
- 间接寻址:指令地址字段中的形式地址不是操作数的真正地址,而是操作数地址的指示器.或者说此形式地址单元的内容才是操作数的有效地址.比如:
OP=MEM[MEM[A1]]
- 寄存器寻址/寄存器间接寻址:
OP=REG[A1]
orOP=REG[REG[A1]]
指令的格式为:指令+[地址1]+[地址2](Optional).例
COMMAND A1 A2
- 隐含寻址:隐含在指令里的默认寻址
- 立即寻址:指令的地址字段指出的不是操作数的地址,而是操作数本身
- 相对寻址:把程序计数器PC的内容加上指令格式中的形式地址D而形成操作数的有效地址.
OP=MEM[PC+A1]
- 基址变址寻址:操作数所在的地址是一个基址寄存器和一个变址寄存器内容的和.比如:
mov ax,[bx+si]
- 基址变址相对寻址:操作数所在的地址是一个基址寄存器一个变址寄存器只和再与一个8bit或一个16bit位移量只和得到.比如:
mov ax,[bx+si]+12h
- 寄存器直接寻址:
-
指令周期(Instruction Cycle):取出并执行一条指令的时间。
CPU周期:一条指令执行过程被划分为若干阶段,每一阶段完成所需时间。
时钟周期(Clock Cycle):又称震荡周期,是处理操作的最基本单位。
对于一条指令:
- 取得指令:CPU内有程序计数器(PC),它储存下一个要执行的指令的地址。处理器按PC储存的地址,经主内存取得指令的内容,PC加1,经数据总线将指令存入指令寄存器(IR)。
- 间址周期:取操作数,如果有
- 执行指令
上述三个CPU周期即为取指,间址,执行.还会有中断周期.
一个指令周期包含1/2/3/4/More个CPU周期,一个CPU周期包含若干个tick(时钟周期).tick是最基本的时间单位.
肥肠有价值的参考:计算机组成原理 (open.com.cn)
-
- 吞吐率(Through Put)—— 单位时间内流水线完成任务数量或输出的结果数:\(TP = n / Tk\)
- 加速比——完成一批任务,不使用流水线时间与使用流水线所用的时间之比。不使用÷使用,>1
- 效率(Efficiency)——流水线的设备利用率。在时空图上,流水线的效率定义为n个任务时间占用的时空区,与k个功能段总的时空之比
- 对于所有优先级低于该级别的,屏蔽字设为1
- 自己也设为1
hint:最高优先级的全部为1.屏蔽位=1,表示屏蔽;屏蔽位=0,表示中断开放。
Operate System
-
-
进程和线程的管理 ——进程线程的状态、控制、同步互斥、通信调度等
-
存储管理——分配/回收、地址转换、存储保护等
-
文件管理——文件目录、文件操作、磁盘空间、文件存取控制
-
设备管理——设备驱动、分配回收、缓冲技术等
-
用户接口——系统命令、编程接口
-
-
- FIFO/FCFS
- 时间短作业优先 SJF(非抢占)/SPF(抢占) 问题:进程饥饿
- 相应比高优先:响应比=等待时间/计算时间
- 优先级调度: 静态优先权:创建进程时确定,整个运行期间保持不变。动态优先权:创建进程时赋予的优先权可随进程的推进或随其等待时间的增加而改变。
- 时间片轮转调度算法
- 排成一个队列。
- 每次调度时将CPU分派给队首进程。
- 时间片结束时,发生时钟中断。
- 暂停当前进程的执行,将其送到就绪队列的末尾,并通过上下文切换执行当前就绪的队首进程。
- 进程阻塞情况发生时,未用完时间片也要出让CPU。
- 能够及时响应,但没有考虑作业长短等问题。
- 系统的处理能力和系统的负载状态影响时间片长度。
- 多级反馈队列FB
- 准备调度:放入第一队列尾部
- 时间片内第一次执行完毕,如果没有执行完则放到第二队列尾
- Loop直到最后一个队列,就按照正常的时间片轮转调度执行。
平均周转时间=Average(作业的周转时间)
作业的周转时间=作业提交(到达操作系统)时间 to 作业完成时间
带权周转时间=作业周转时间/实际运行时间
-
- 手工磁带
- 批处理操作系统
- 单道批处理:内存中仅有一道程序运行,即监督程序每次从磁带上只调入一道程序进入内存运行,当该程序完成或发生异常情况时,才换入其后继程序进入内存运行。每次内存中只放一个作业
- 多道批处理:引入中断,内存中存放多个作业交替运行
- 分时操作系统:时间片轮转机制;交互性;及时性
- 实时操作系统:引入硬中断:软实时和硬实时
-
P是-1,V是+1
//基本变量 mutex=1;//临界区锁变量 empty=n;//空闲缓冲区数量,给producer校验 full=0;//有内容的缓冲区数量,给consumer校验,恒有full+empty=n //生产者 void producer() { p(empty);//校验是否有空缓冲区 p(mutex);//校验通过,锁闭临界区 save();//事务代码 v(full); v(mutex);//释放临界区 } //消费者 void consumer() { p(full); p(mutex); load();//事务代码 v(empty); v(mutex); }
-
See 操作系统——段式存储管理、段页式存储管理 - 王陸 - 博客园 (cnblogs.com)
段式存储:按照程序自身的逻辑关系划分为若干个段,每个段都有一个段名(在低级语言中,程序员使用段名来编程),每段从0开始编址。
地址格式为
ss:addr
段名-段内offset。段名和基址的映射存在段表中。页式存储:See 操作系统——页式存储管理 - 王陸 - 博客园 (cnblogs.com)
Key:块-页式存储
物理空间划分为多个块,进程的地址空间划分为等大的页(2的幂,因为要编址)
然后在页表中进行映射。页表的首地址放在PCB中。
快表:在地址变换机构的寄存器中放置页表的Cache,称TLB
查询顺序:TLB-内存中的页表
两级/多级页表:顾名思义...
用一张“位示图”构成主存分配表。位示图的每一位与一个主存块对应,其值为0,表示对应的主存块空闲,其值为1,表示对应的主存块已分配。
虚拟存储器:内存特别小的时候,可以只驻留一部分页在内存中,其他从磁盘中调入调出。有时候会发生缺页中断,若此时内存中没有空闲物理块安置请求调入的新页面,则系统按预定的策略自动选择一个(请求调入策略)或一些(预调入策略)在内存的页面,把它们换出到外存。
逻辑上造成了一个对程序透明的更大的虚拟存储器。
页面调度算法:
-
FIFO:总是淘汰最先进入内存的页面
-
LRU:选择内存中最久未使用的页面被置换
-
二次机会淘汰算法:该算法首先检查位于FIFO链链首的页,如果它的访问位为0,则选择该页淘汰;如果它的访问位为1,则清除其访问位,将它移至FIFO链的链尾,重复此算法的查找过程,直至遇到新链首页是一个访问位为0的较早进入内存的页为止,把它选为被淘汰的页。
-
时钟算法:就是把进程所访问的页面链成一个环形链表,再设一个指针指向最老的页面就是一个改进的二次机会淘汰算法。如果访问位为1,重置为0;循环查找下一个访问位0的。
-
NRU最近未用淘汰算法:该算法每次都尽量选择最近最久未被写过的页面淘汰,这种干净的页面可以不被写回到磁盘。
按照下列次序选择被淘汰的页面:
- 访问位=0,修改位=0;直接淘汰;
- 访问位=0,修改位=1;写回外存后淘汰;
- 访问位=1,修改位=0;直接淘汰;
- 访问位=1,修改位=1;写回外存后淘汰;
例子:缺页中断率=缺页发生数/调页请求总数
段页式存储管理:
每个段设置单独的页系统
即段-页二级结构(页在物理内存中的映射就是块)
-
-
块设备的输入:
- 磁盘->缓冲
- 缓冲->内存用户区
- 用户计算
当只有单缓时,12步骤不能同时进行
单缓冲下平均时间\(T=max(T_s,T_c)+T_m\)
双缓下,一个缓冲区向内写,一个向外读,步骤12可以同时进行
双缓冲平均时间为\(max(T_c,T_s)\)
-
磁盘的延迟时间=寻道时间+旋转延迟+传输时间
-
- FCFS:先来先服务,假设当前磁道在某一位置,依次处理服务队列里的每一个磁道
- SSTF:最短寻道时间算法。这种算法的本质是利用贪心算法来实现,假设当前磁道在某一位置,接下来处理的是距离当前磁道最近的磁道号,处理完成之后再处理离这个磁道号最近的磁道号,直到所有的磁道号都服务完了程序结束.会发生饥饿。
- SCAN:电梯算法。:磁头只有移动到请求最外侧磁道或最内侧磁道才可以反向移动,如果在磁头移动的方向上已经没有请求,就可以立即改变磁头移动,不必移动到最内/外侧的磁道
- LOOK SeeLOOK磁盘调度算法解析和代码实现详解 - lsbin: LOOK算法的服务请求与SCAN算法相似, 同时它还"向前看", 就好像在同一方向上需要维护更多的磁道一样。如果在移动方向上没有待处理的请求, 则磁头反转方向, 并开始在相反的方向上处理请求。 在该算法中, 磁头不允许移动到磁盘末端
- C-SCAN:改进电梯算法:规定只有磁头朝某个特定方向移动时才处理磁道访问请求,而返回时直接快速移动至最靠边缘的并且需要访问的磁道上而不处理任何请求。