目录
讲解视频推荐:
【BOK408真题讲解-2022】
一、数据结构
1. 算法题(二叉搜索树)13’
已知非空二叉树 T 的结点值均为正整数,采用顺序存储方式保存,数据结构定义如下:
typedef struct { //MAX_SIZE为己定义常量
int SqBiTNode[MAX_SIZE]; //保存三叉树结点值的数组
int ElemNum; //实际占用的数组元素个数
} SqBiTree;
T 中不存在的结点在数组 SqBiTNode 中用 -1 表示。例如,对于下图所示的两棵非空二叉树 T1 和 T2 ,
请设计一个尽可能高效的算法,判定一棵采用这种方式存储的二叉树是否为二叉搜索树, 若是,则返回 true ,否则,返回 false 。要求:
(1)给出算法的基本设计思想。
(2)根据设计思想, 采用 C 或 C++ 语言描述算法,关键之处给出注释。
【解析】:
(1)对于采用顺序存储方式保存的二叉树,根结点保存在 SqBiTNode[0] 中,当某结点保存在 SqBiTNode[i] 中时,若有左孩子,则其值保存在 SqBiTNode[2i+1] 中,若有右孩子,则其值保存在 SqBiTNode[2i+2] 中,若有双亲结点,则其值保存在 SqBiTNode[(i-1)/2] 中。
二叉搜索树需要满足的条件是:任一结点值大于其左子树中的全部结点值,小于其右子树中的全部结点值。中序遍历二叉树得到一个升序序列。
使用整型变量 val 记录中序遍历过程中已遍历结点的最大值,初值为一个负整数。若当前遍历的结点值小于或等于 val ,则算法返回 false ,否则,将 val 的值更新为当前结点的值。
(2)算法的实现:
#define false 0
#define true 1
typedef int bool;
bool judgeInOrderBST(SqBiTree bt, int k, int *val){ //初始调用时 k = 0
if(k < bt.ElemNum && bt.SqBiTNode[k] != -1){
if(!judgeInOrderBST(bt, 2*k+1, val)){return false;} //左
if(bt.SqBiTNode[k] <= *val){return false;} //根
*val = bt.SqBiTNode[k];
if(!judgeInOrderBST(bt, 2*k+2, val)){return false;} //右
}
return true;
}
【方法二】:
二叉搜索树需要满足的条件是:任一结点值大于其左子树中的全部结点值,小于其右子树中的全部结点值。设置两个数组 pmax 和 pmin 。根据二叉搜索树的定义,SqBiTNode[i] 中的值应该大于以 SqBiTNode[2i+1] 为根的子树中的最大值(保存在 pmax[2i+1] 中),小于以 SqBiTNode[2i+2] 为根的子树中的最小值(保存在 pmin[2i+1] 中)。初始时,用数组 SqBiTNode 中前 ElemNum 个元素的值对数组 pmax 和 pmin 初始化。在数组 SqBiTNode 中从后向前扫描,扫描过程中逐一验证结点与子树之间是否满足上述的大小关系。
2. 选择排序 10’
现有 n ( n > 100000 ) 个数保存在一维数组 M 中, 需要查找 M 中最小的 10 个数。请回答下列问题。
(1)设计一个完成上述查找任务的算法,要求平均情况下的比较次数尽可能少,简述其算法思想(不需要程序实现) 。
(2)说明你所设计的算法平均情况下的时间复杂度和空间复杂度。
【解析】:
(1)定义含 10 个元素的大根堆 H ,元素值均为该堆元素类型能表示的最大数 MAX 。
for M 中的每个元素 s {
if(s < H 的堆顶元素){删除堆顶元素并将 s 插入 H 中;}
}
当数据全部扫描完毕,堆 H 中保存的即是最小的 10 个数。
(2)算法平均情况下的时间复杂度是 O(n) ,空间复杂度是 O(1) 。
二、计算机组成原理
1. 数据通路的功能和基本结构 15’
某 CPU 中部分数据通路下图所示,其中,GPRs 为通用寄存器组;FR 为标志寄存器,用于存放 ALU 产生的标志信息; 带箭头虚线表示控制信号,如控制信号 Read 、Write 分别表示主存读、主存写,MDRin 表示内部总线上数据写入 MDR , MDRout 表示 MDR 的内容送内部总线。
请回答下列问题。
(1)设 ALU 的输入端 A 、B 及输出端 F 的最高位分别为 A15 、B15 及 F15 ,FR 中的符号标志和溢出标志分别为 SF 和 OF ,则 SF 的逻辑表达式是什么? A 加 B 、A 减 B 时 OF 的逻辑表达式分别是什么?要求逻辑表达式的输入变量为 A15 、B15 及 F15 。
(2)为什么要设置暂存器 Y 和 Z?
(3)若 GPRs 的输入端 rs 、rd 分别为所读、写的通用寄存器的编号,则 GPRs 中最多有多少个通用寄存器? rs 和 rd 来自图中的哪个寄存器?已知 GPRs 内部有一个地址译码器和一个多路选择器,rd 应连接地址译码器还是多路选择器?
(4)取指令阶段(不考虑 PC 增量操作)的控制信号序列是什么?若从发出主存读命令到主存读出数据并传送到 MDR 共需 5 个时钟周期,则取指令阶段至少需要几个时钟周期?
(5)图中控制信号由什么部件产生?图中哪些寄存器的输出信号会连到该部件的输入端?
【解析】:
(1)SF 的逻辑表达式是:SF = F15 ;
A 加 B 时 OF 的逻辑表达式是:┐A15 · ┐B15 · F15 + A15 · B15 · ┐F15 ;
A 减 B 时 OF 的逻辑表达式是:┐A15 · B15 · F15 + A15 · ┐B15 · ┐F15 。
对于 A + B → F ,若 A、B 为正,F 为负 or A、B 为负,F 为正,则表示溢出;
对于 A - B → F ,若 A 为正、B 为负,F 为负 or A 为负、B 为正,F 为正,则表示溢出。
(2)在单总线数据通路中,每个时刻总线上只有一个数据有效。由于 ALU 是一个没有存储功能的组合逻辑元件,在其执行运算时必须保持两个输入端同时有效,因此先将一个操作数经内部总线送入暂存器 Y 保存,Y 的内容在 ALU 的左输入端始终有效,再将另一个操作数经内部总线直接送到 ALU 的右输入端。
此外,ALU 的输出端也不能直接与总线相连,否则其输出会通过总线反馈到输入端,影响运算结果,因此将运算结果暂存在寄存器 Z 中。
(3)GPRs 中最多有 24 = 16 个通用寄存器;rs 和 rd 来自指令寄存器 IR ;已知 GPRs 内部有一个地址译码器和一个多路选择器,rd 应连接地址译码器。
(4)取指令阶段的控制信号序列是:
① (PC) → MAR ;【PCout、MARin】(1 个时钟周期)
② M(MAR) → MDR ;【Read】(5 个时钟周期)
③ (MDR) → IR 。【MDRout、IRin】(1 个时钟周期)
取指令阶段至少需要 7 个时钟周期。
(5)图中控制信号由控制部件(CU)产生;图中指令寄存器 IR 和标志寄存器 FR 的输出信号会连到该部件的输入端。
2. I/O 方式 8’
假设某磁盘驱动器中有 4 个双面盘片,每个盘面有 20000 个磁道,每个磁道有 500 个扇区,每个扇区可记录 512 字节的数据,盘片转速为 7200 rpm(转/分),平均寻道时间为 5ms 。
请回答下列问题。
(1)每个扇区包含数据及其地址信息,地址信息分为 3 个字段。这 3 个字段的名称各是什么?对于该磁盘,各字段至少占多少位?
(2)一个扇区的平均访问时间约为多少?
(3)若采用周期挪用 DMA 方式进行磁盘与主机之间的数据传送,磁盘控制器中的数据缓冲区大小为 64 位,则在一个扇区读写过程中,DMA 控制器向 CPU 发送了多少次总线请求?若 CPU 检测到 DMA 控制器的总线请求信号时也需要访问主存,则 DMA 控制器是否可以获得总线使用权?为什么?
【解析】:
(1)这 3 个字段的名称各是柱面号、盘面号、扇面号;对于该磁盘,柱面号至少占 ⌈log220000⌉ = 15 位、盘面号至少占 log2(2×4) = 3 位、扇面号至少占 ⌈log2500⌉ = 9 位。
(2)盘片转速为 7200 转/分,得到 1/120 s/转,延迟时间 = (1/120)/2 s ≈ 4.167ms ;
传输时间 = (1/120)/500 s ≈ 0.0167ms ;
平均访问时间 = 平均寻道时间 + 延迟时间 + 传输时间 = 5 + 4.167 + 0.0167 = 9.1837ms 。
(3)在一个扇区读写过程中,DMA 控制器向 CPU 发送了 512B / (64/8)B = 64 次总线请求;
DMA 控制器可以获得总线使用权,由于采用周期挪用 DMA 方式,因此当 CPU 和 DMA 控制器同时访问主存时,DMA 控制器可以获得总线使用权,因为一旦磁盘开始读写,就必须按时完成数据传送,否则会发生数据丢失。
三、操作系统
1. 文件系统基础 7’
某文件系统的磁盘块大小为 4KB ,目录项由文件名和索引节点号构成,每个索引节点占 256 字节,其中包含直接地址项 10 个,一级、二级和三级间接地址项各 1 个,每个地址项占 4 字节。该文件系统中子目录 stu 的结构如图 (a) 所示,stu 包含子目录 course 和文件 doc ,course 子目录包含文件 course1 和 course2 。各文件的文件名、索引节点号、占用磁盘块的块号如表 (b) 所示。
表 (b) :
文件名 | 索引节点号 | 磁盘块号 |
---|---|---|
stu | 1 | 10 |
course | 2 | 20 |
course1 | 10 | 30 |
course2 | 100 | 40 |
doc | 10 | x |
请回答下列问题。
(1)目录文件 stu 中每个目录项的内容是什么?
(2)文件 doc 占用的磁盘块的块号 x 的值是多少?
(3)若目录文件 course 的内容已在内存, 则打开文件 course1 并将其读入内存, 需要读几个磁盘块?说明理由。
(4)若文件 course2 的大小增长到 6MB ,则为了存取 course2 需要使用该文件索引节点的哪几级间接地址项?说明理由。
【解析】:
(1)目录文件 stu 中每个目录项的内容是:
文件名 | 索引节点号 |
---|---|
course | 2 |
doc | 10 |
在文件系统中,目录项由文件名和索引节点号构成。
(2)文件 doc 占用的磁盘块的块号 x 的值是 30 。
由上表可知,文件 doc 和文件 course1 对应的索引节点号都是 10 ,说明 doc 和 course1 这两个目录项共享一个索引节点,本质上对应同一个文件,而文件 course1 存储在 30 号磁盘块。
(3)若目录文件 course 的内容已在内存, 则打开文件 course1 并将其读入内存, 需要读 2 个磁盘块。先读 course1 的索引节点所在的磁盘块,再读 course1 的内容所在的磁盘块。
(4)若文件 course2 的大小增长到 6MB ,则为了存取 course2 需要使用该文件索引节点的一级间接地址块和二级间接地址块。
6MB 大小的文件需要 6MB / 4KB = 1536 个磁盘块,已知直接地址项有 10 个,一级间接地址项有 4KB / 4B = 1024 个,二级间接地址项有 1024 × 1024 个,而 10 + 1024 < 1536 < 10 + 1024 + 1024 × 1024 。
2. 同步与互斥 8’
某进程的两个线程 T1 和 T2 并发执行 A 、B 、C 、D 、E 和 F 共 6 个操作, 其中 T1 执行 A 、E 和 F , T2 执行 B 、C 和 D 。下图表示上述 6 个操作的执行顺序所必须满足的约束:C 在 A 和 B 完成后执行,D 和 E 在 C 完成后执行,F 在 E 完成后执行。请使用信号量的 wait() 、signal() 操作描述 T1 和 T2 之间的同步关系,并说明所用信号量的作用及其初值。
【解析】:
对于 T2 来说,T1 的 A 执行完毕后,T2 才可以执行 C ;
对于 T1 来说,T2 的 C 执行完毕后,T2 才可以执行 E 。
Semaphore Sac = 0; //描述 A C 之间的同步关系
Semaphore Sce = 0; //描述 C E 之间的同步关系
T1{
A;
signal(Sac);
wait(Sce);
E;
F;
}
T2{
B;
wait(Sac);
C;
signal(Sce);
D;
}
四、计算机网络
IPv4 9’
某网络拓扑如下图所示,R 为路由器,S 为以太网交换机,AP 是 802.11 接入点,路由器的 E0 接口和 DHCP 服务器的 IP 地址配置如图中所示;H1 与 H2 属于同一个广播域,但不属于同一个冲突域;H2 和 H3 属于同一个冲突域;H4 和 H5 已经接入网络,并通过 DHCP 动态获取了 IP 地址。现有路由器、100BaseT 以太网交换机和 100BaseT 集线器(Hub)三类设备各若干台。
请回答下列问题。
(1)设备 1 和设备 2 应该分别选择哪类设备?
(2)若信号传播速度为 2 × 108 m/s ,以太网最小帧长为 64B ,信号通过设备 2 时会产生额外的 1.51μs 的时间延迟,则 H2 与 H3 之间可以相距的最远距离是多少?
(3)在 H4 通过 DHCP 动态获取 IP 地址过程中,H4 首先发送了 DHCP 报文 M , M 是哪种 DHCP 报文?路由器 E0 接口能否收到封装 M 的以太网帧?S 向 DHCP 服务器转发的封装 M 的以太网帧的目的 MAC 地址是什么?
(4)若 H4 向 H5 发送一个 IP 分组 P ,则 H5 收到的封装 P 的 802.11 帧的地址 1 、地址 2 和地址 3 分别是什么?
【解析】:
(1)设备 1 应该选择 100BaseT 以太网交换机;设备 2 应该选择 100BaseT 集线器(Hub)。
(2)已知 100Base-T 是一种以 100Mbps 速率工作的局域网(LAN)标准,以太网最小帧长为 64B ;信号传播速度为 2 × 108 m/s ;假设 H2 与 H3 之间可以相距的最远距离是 D ,有:
[64 × 8 / 100 × 106] - 2 × 1.51 × 10-6 = 2 × D / 2 × 108 ,解得 D = 210m 。
(3)M 是 DHCP 发现报文(DISCOVER 报文);路由器 E0 接口可以收到封装 M 的以太网帧;S 向 DHCP 服务器转发的封装 M 的以太网帧的目的 MAC 地址是 FF-FF-FF-FF-FF-FF 。
DHCP 发现报文是广播的形式,广播帧的目的 MAC 地址全是 1 。
(4)若 H4 向 H5 发送一个 IP 分组 P ,则 H5 收到的封装 P 的 802.11 帧的地址 1 是 00-11-11-11-11-E1 、地址 2 是 00-11-11-11-11-C1 、地址 3 是 00-11-11-11-11-D1 。(来自 AP)