科目组合
计算机: 数据结构 、计算机组成原理 、操作系统 、计算机网络
由于二叉搜索树的中序遍历序列为递增序列,本算法采用中序递归遍历二叉树,并记录当前找到的最小绝对值差值 min。
遍历过程中,每访问一个结点时计算目标值与当前结点值之差的绝对值:
min,则更新 min;min,说明后续结点的差值会更大,此时可停止查找(可通过标志变量 flag 控制递归终止)。
// 当前的绝对值差值最小值
int min = INT_MAX;
// 最小绝对值差值是否已经找到
int flag = 0;
// 存储待输出的结点关键字
int min_data[2];
int min_idx = 0;
void searchMinDiff(BTNode *root, int K) {
if (!root) return;
if (flag) return;
searchMinDiff(root->left, K);
// 中序遍历
int diff = abs(K - root->data);
if (diff < min) {
min = diff;
min_data[0] = root->data;
min_idx = 1;
} else if (diff == min) {
min_data[min_idx++] = root->data;
} else {
flag = 1;
}
searchMinDiff(root->right, K);
}
void solve(BTNode *root, int K) {
searchMinDiff(root, K);
printf("min diff: %d\n", min);
for (int i = 0; i < min_idx; i++) {
printf("min element: %d\n", min_data[i]);
}
}
评分及理由
(1)得分及理由(满分4分)
得分:4分
理由:你的算法基本思想描述清晰、正确。你准确地指出了利用二叉搜索树中序遍历的递增性质,通过比较差值与当前最小值`min`来判断是否继续查找,并提到了使用`flag`标志位控制递归终止。这与标准答案的核心思想完全一致,因此获得满分。
(2)得分及理由(满分8分)
得分:6分
理由:你的代码实现整体逻辑正确,但存在一处稍显不足的地方,导致无法完美处理题目要求输出的所有情况。
题目总分:4+6=10分
第一个序列不能得到,第二个序列可以得到。 Pj<Pk<Pi . 5
已知当 n=k−1 时,栈可得到的出栈序列总数为
Ck−1=M
其中 Cn 为第 n 个卡特兰数。
评分及理由
(1)得分及理由(满分2分)
学生回答“第一个序列不能得到,第二个序列可以得到”,该判断与标准答案一致。但标准答案中要求判断两个序列,第一个序列{2,3,1,6,4,7,5,4,8}中有重复数字4,这本身已不合法,学生未指出此逻辑错误(重复数字使得序列长度与n=9矛盾,无法由1..9的入栈序列得到)。由于判断结果正确(不能得到),且第二个序列判断正确(能得到),未完全扣到细节但整体判断无误,因此给满分。得分:2分。
(2)得分及理由(满分2分)
学生回答“Pj < Pk < Pi”,标准答案为“Pi > Pk > Pj”,两者等价(即Pi最大,Pj最小,Pk中间),但表述顺序不同。学生写的“Pj < Pk < Pi”实际上是Pj最小、Pk中间、Pi最大,与标准答案大小关系一致,因此正确。得分:2分。
(3)得分及理由(满分2分)
学生仅回答“5”,未列出具体序列。标准答案要求给出具体个数,答案5是正确的,但未列出序列不扣分(因为只要求个数)。因此给满分。得分:2分。
(4)得分及理由(满分4分)
学生回答“已知当n=k-1时,栈可得到的出栈序列总数为 C_{k-1} = M”,并将卡特兰数写为Cn(通常卡特兰数公式为C_{2n}^n/(n+1))。但问题要求回答n=k时以1开头的个数、以2开头的个数、以及总序列个数,学生未给出任何具体回答(没有回答以1开头的个数、以2开头的个数、总个数),仅做了无关陈述。因此完全未作答,不得分。得分:0分。
题目总分:2+2+2+0=6分
主存单元宽度:8 位 通用寄存器宽度:16 位 op1 和 op2 可以相同,因为两者在指令中占据不同位。op2 和 op3 不能相同,因为两者在指令中占据相同位,若相同会导致指令冲突。 R2 中的内容变为 98CEH,R9 中的内容保持不变为 F001H。 ① = 1110,② = 0000 0100,③ = 1111 1011,④ = 0000 0000 0010。
评分及理由
(1)得分及理由(满分2分)
学生回答:“主存单元宽度:8 位 通用寄存器宽度:16 位”。
标准答案为:主存单元宽度8位,通用寄存器宽度16位。学生答案完全正确,无逻辑错误。得分:2分。
(2)得分及理由(满分2分)
学生回答:“op1 和 op2 可以相同,因为两者在指令中占据不同位。op2 和 op3 不能相同,因为两者在指令中占据相同位,若相同会导致指令冲突。”
标准答案为:OP1和OP2可以相同,OP2和OP3不可以相同。学生回答正确,思路清晰,理由正确。无逻辑错误。得分:2分。
(3)得分及理由(满分2分)
学生回答:“R2 中的内容变为 98CEH,R9 中的内容保持不变为 F001H。”
标准答案为:R2的内容为ABCDH + F001H = 9BCEH,R9内容不变为F001H。学生计算结果为98CEH,与标准答案9BCEH不符。
正确计算:ABCDH + F001H = (A + F) = 19H(进位1),(B + 0) = BH,加上进位为CH,(C + 0) = CH,(D + 1) = EH,结果为9BCEH(注意最高位溢出,实际16位结果为9BCEH)。学生可能误算为98CEH,存在逻辑错误。得分:0分。
(4)得分及理由(满分4分)
学生回答:“① = 1110,② = 0000 0100,③ = 1111 1011,④ = 0000 0000 0010。”
标准答案为:①是1110;②是0000 0100;③是1111 1011;④是0000 0000 0010。学生答案与标准答案完全一致,无逻辑错误。得分:4分。
题目总分:2+2+0+4=8分
(1) 多路选择器
R 型指令需要用到寄存器编号 rs 和 rt,M 型指令需要用到寄存器 0 和 15,所以需要通过二路选择器进行选择。
(2) 只需要 1 位,因为只需要 1 位就可以实现零扩展和符号扩展这两种操作。
MARSrc=0, ALUA Src=0, ALUB Src=1, RegWr = 0
(4) 左移指令需要通过扩展器获取到左移的立即数,所以 ALUB Src=2,计算结果通过 ALU 写回到通用寄存器中,所以 RegWSrc=1,RegWr=1,写入的寄存器位 R[rt],所以 RegDst=1。
综上:ALUB Src=2, RegWSrc=1, RegDst=1, RegWr=1
评分及理由
(1)得分及理由(满分1分)
得1分。学生回答“多路选择器”正确,与标准答案一致,理由虽稍多余但不影响得分。
(2)得分及理由(满分2分)
得2分。学生回答“1位”正确,并解释了通过1位即可实现零扩展和符号扩展两种操作,与标准答案一致,理由充分。
(3)得分及理由(满分4分)
得0分。学生回答“MARSrc=0, ALUA Src=0, ALUB Src=1, RegWr = 0”,但标准答案要求顺序为 MARsrc、ALUAsrc、ALUBsrc、RegWr。学生将“MARsrc”误写为“MARSrc”,且将“ALUAsrc”误写为“ALUA Src”(多了空格),但最核心的错误是:学生未按题目要求给出4个控制信号的答案,而是直接在(3)中写了答案却未正确编号,实际答案内容虽数值正确,但格式混乱,且学生将(3)的答案与(4)的说明混在一起(学生作答中(3)位置没有独立列出答案,而是直接放在(2)之后),导致无法明确其意图。按严格判卷规则,答案未按顺序清晰列出,视为回答不完整,扣4分。
(4)得分及理由(满分2分)
得0分。学生回答“ALUB Src=2, RegWSrc=1, RegDst=1, RegWr=1”,但标准答案要求的是“ALUBsrc=2,RegWsrc=1,RegDst=1,RegWr=1,不可以相同”。学生未回答“Extop 是否可以与 M 型指令中的 EXTop 相同?为什么?”这一关键问题,导致回答不完整。按题目要求,此部分包含两个子问题:控制信号取值和扩展方式比较,学生只回答了前者,遗漏后者,扣2分。
题目总分:1+2+0+0=3分
中断次数、CPU 调度次数与各进程首次调度时刻模拟调度过程,考虑时钟中断每 10 ms 发生一次,进程到达、完成及调度事件如下:
10 ms:P1、P2 到达,CPU 空闲,调度 P2 运行(首次调度)。
20 ms:时钟中断,P2 运行 10 ms 后被更高优先级的 P4 抢占,调度 P4 运行(首次调度)。70 ms:时钟中断,P4 时间片用完,优先级减 1,调度 P2 运行。80 ms:时钟中断,P2 完成,调度 P4 运行。90 ms:时钟中断,P4 完成,调度 P1 运行(首次调度)。140 ms:时钟中断,P1 时间片用完,优先级减 1,调度 P3 运行(首次180 ms:时钟中断,P3 完成,调度 P1 运行。225 ms:P1 完成,所有进程结束中断次数:从 10 ms 开始,时钟中断时刻为 10, 20, …, 220 ms,共 22 次。
CPU 调度次数:共 7 次(10 ms、20 ms、70 ms、80 ms、90 ms、140 ms、180 ms)。
首次调度时刻:
时间片由 50 ms 改为 100 ms:时间片增大,进程因时间片用完而让出 CPU 的次数减少,更多进程可能一次运行完成,从而降低进程切换频率,CPU 调度次数减少。 时钟中断间隔由 10 ms 改为 1 ms:中断更频繁,每次中断均需进行调度检查,可能增加上下文切换次数与中断处理时间,系统开销增大。
评分及理由
(1)得分及理由(满分5分)
学生对于中断次数和CPU调度次数的计算结果(22次中断,7次调度)与标准答案一致,这部分正确,可得2分。但学生在调度过程的描述中存在多处逻辑错误:
综上,学生因调度过程逻辑错误,扣2分,但中断次数、调度次数和首次调度时刻基本正确,故(1)题得分:3分(5分满分扣2分)。
(2)得分及理由(满分2分)
学生回答“CPU调度次数减少,系统开销增大”与标准答案一致,且理由正确(时间片增大减少切换,中断间隔减小增加开销)。因此得2分。
题目总分:3+2=5分
131 2 4096×32=131072 。
删除目录 dir1(非空)需递归删除其下文件 file,再删除自身,对元数据的操作包括:
评分及理由
(1)得分及理由(满分3分)
学生答案中:
- “131”计算正确,与标准答案一致。每个盘块可存储32个索引节点(4KB/128B=32),索引节点号1000在第32页内偏移第8个(1000 mod 32=8),起始盘块号100,故盘块号=100+floor(1000/32)=100+31=131,正确,获得1分。
- “2”错误。正确答案最多需要读2个盘块(一个索引节点块+一个数据块),学生未解释或明确给出此数值,仅写“2”但未说明含义,且后续分析中未体现读取过程,无法判断是否答对。根据上下文,学生可能混淆了“需要读的盘块数”与“地址项层级”,实际应为2个盘块,但学生未给出完整推理,故不得分。
- “4096×32=131072”是错误的。标准答案要求最大文件数应为(4096×4KB)/128B=2^17=131072个,但学生仅写了乘法结果,未明确说明这是最大文件数,且计算过程与索引节点表总容量无关(索引节点表占用4096个盘块,每个盘块32个索引节点,总数为4096×32=131072),但学生未正确表述“最多可以存放多少个文件”这一问题的答案,且未正确关联到索引节点表总容量。此外,学生答案中缺少对“最多需要读多少个盘块”的明确回答。本题共3小问,学生仅答对第一小问(盘块号),故得1分。
(2)得分及理由(满分5分)
学生答案正确描述了删除目录dir1的步骤:先递归删除子文件file,再删除dir1自身,包括释放索引节点、数据块、位图更新以及目录项删除。与标准答案一致,获得满分5分。
题目总分:1+0+5=6分
(1)TCP 连接需要 三次握手。C 收到的 SYN=1、ACK=1 的 TCP 段是第二次握手,其确认序号为 C 的初始序号加 1,即 1000 + 1 = 1001。
(2)收到该确认段时,C 的拥塞窗口增加 1 MSS,从 2 MSS 增加到 3 MSS 即 1500B。发送窗口取拥塞窗口和接收窗口的最小值,即 min(3 MSS, 1000 B) = 1000 B。
(3)TCP 连接释放需要 四次挥手。C 收到的最后一个报文段是 Si 发送的 FIN+ACK 段,其序列号 seq 为 Si 的初始序号加 1(SYN 消耗一个序号),即 2000 + 1 = 2001;确认序号为 C 的 FIN 序号加 1,C 发送的数据最后一个字节序号为 3000,FIN 段序号为 3001,故确认号为 3001 + 1 = 3002;FIN 标志位为 1。
(4)从连接建立开始,忽略报文段传输时延,连接建立耗时 1 RTT = 5 ms。数据传输过程中,受接收窗口限制,每次最多发送 2 MSS,共需传输 4 MSS。第一个报文段在连接建立后发送,其 ACK 在 1 RTT 后到达(5 + 5 = 10 ms),随后发送两个报文段,其 ACK 在下一个 RTT 后到达(10 + 5 = 15 ms),接着发送最后一个报文段,其 ACK 在再一个 RTT 后到达(15 + 5 = 20 ms)。故 C 确定 Si 成功接收文件的时间为 20 ms。
评分及理由
(1)得分及理由(满分3分)
学生回答正确。对于三次握手的次数判断无误,确认序号计算正确(初始序号1000+1=1001),符合TCP连接建立机制。得3分。
(2)得分及理由(满分2分)
学生回答正确。拥塞窗口从2MSS增加到3MSS(1500B),发送窗口取拥塞窗口与接收窗口最小值(1000B)的理由充分且计算正确。得2分。
(3)得分及理由(满分2分)
学生回答存在逻辑错误。题目中C发送的总数据长度为2000B(4个MSS),初始序号为1000,因此C最后发送的数据字节序号范围是1000~2999(共2000字节),数据发送完成后C发送FIN段,其序号应为3000(而非3001)。学生对FIN段序号的解释中,误认为C的FIN段序号为3001,导致最后的确认序号计算为3002,与标准答案的seq=2001、ack_seq=3002不一致。虽然最终确认序号结果巧合正确(3002),但推导过程逻辑错误,且seq值应为2001(来自Si的初始序号2000+SYN消耗1),学生正确回答了seq=2001和FIN=1。本题应扣1分,得1分。
(4)得分及理由(满分2分)
学生回答正确。对传输时间分析合理:连接建立1RTT,数据传输受接收窗口限制分4次发送(每次2MSS=1000B),总耗时从连接建立算起共4RTT=20ms。得2分。
题目总分:3+2+1+2=8分