计算机科学测验 - III: 第 1 部分

2024 年 11 月 12 日 | 阅读 15 分钟

主题 - 6 数据结构

1) 数组 A 和 B 分别用于存储两个矩阵 M1 和 M2。每个数组都可以放置在相邻的内存区域中,无论是按行主序还是按列主序。算法在计算 M1 x M2 的时间复杂度是

  1. 其中一个以行主序存储,另一个以列主序存储时效果最好
  2. 两者都以行主序存储时效果最好
  3. 两者都以列主序存储时效果最好
  4. 不依赖于存储方案

答案: (d) 不依赖于存储方案

解释: 请注意,这个问题涉及时间复杂度而不是实际程序执行时间。无论我们如何存储数组元素,为了计算矩阵乘法(就时间复杂度而言),我们总是需要访问相同数量的 M1 和 M2 元素。在访问数组元素时,时间复杂度始终是常数 O(1);对于其他方法,常数可能会改变。


2) 在确定算术表达式中的括号是否平衡时,最有效的数据结构是什么?

  1. AVL 树
  2. 二叉树
  3. Queue
  4. Stack

答案: (d) 栈

解释: 栈是确定算术表达式中的括号是否平衡时最有效的数据结构。


3) 关于栈的链表实现,以下哪个陈述是正确的?

I. 如果在入栈操作期间在链表的开头添加新节点,则在出栈操作期间必须从末尾删除节点。

II. 如果在入栈操作的末尾添加新节点,则在出栈操作期间必须删除开头节点。

  1. I 和 II
  2. 仅 I
  3. 仅 II
  4. 既不是 I 也不是 II

答案: (d) I 和 II 都不正确

说明

栈数据结构遵循“先进后出”的原则。

在栈的链表实现中,如果入栈操作期间在链表开头添加节点,则出栈操作期间必须从链表开头删除节点。或者,如果入栈操作期间在链表末尾添加节点,则出栈操作期间必须从链表末尾删除节点。

以上陈述对于队列数据结构是正确的。

因此,(d) 是正确答案。


4) 在栈上执行了以下一系列操作。

PUSH (10), PUSH (13), PUSH (43), POP (), POP (), PUSH (76), PUSH (7), POP (), PUSH (90), PUSH (24), POP (), POP (), POP (), POP ()

弹出的值的顺序是

  1. 10, 13, 43, 76, 7, 90, 24
  2. 43, 13, 7, 24, 90, 76, 10
  3. 24, 90, 7, 76, 43, 13, 10
  4. 43, 13, 10, 7, 76, 24, 90

答案: (b) 43, 13, 7, 24, 90, 76, 10

解释: 栈数据结构遵循“后进先出”原则,即最后添加的元素(栈顶)将首先被删除。

每一步都在下表中进行了说明

操作Stack输出说明
PUSH (10)[10]-
PUSH (13)[10, 13]-
PUSH (43)[10, 13, 43]-
POP ()[10, 13][43]栈顶元素是 43。
POP ()[10][43, 13]栈顶元素是 13。
PUSH (76)[10, 76][43, 13]
PUSH (7)[10, 76, 7][43, 13]
POP ()[10, 76][43, 13, 7]栈顶元素是 7。
PUSH (90)[10, 76, 90]
PUSH (24)[10, 76, 90, 24]
POP ()[10, 76, 90][43, 13, 7, 24]栈顶元素是 24。
POP ()[10, 76][43, 13, 7, 24, 90]栈顶元素是 90。
POP ()[10][43, 13, 7, 24, 90, 76]栈顶元素是 76。
POP ()-[43, 13, 7, 24, 90, 76, 10]栈顶元素是 10。

输出序列将是 [43, 13, 7, 24, 90, 76, 10]。因此,(b) 是正确答案。


5) 在队列上执行了以下一系列操作。

ENQUEUE (9), ENQUEUE (3), DEQUEUE (), ENQUEUE (17), ENQUEUE (25), DEQUEUE (), DEQUEUE (), ENQUEUE (16), DEQUEUE (), DEQUEUE ()

出队值的顺序是

  1. 3, 25, 17, 16, 9
  2. 16, 25, 17, 3, 9
  3. 9, 3, 17, 25, 16
  4. 3, 9, 25, 17, 16

答案: (c) 9, 3, 17, 25, 16

说明

队列数据结构遵循“先进先出”原则。最先插入的元素(队首)将最先被移除。

每一步都在下表中进行了说明

操作Queue输出说明
ENQUEUE (9)[9]-
ENQUEUE (3)[9, 3]-
DEQUEUE ()[3][9]9 是第一个被插入的。
ENQUEUE (17)[3, 17][9]
ENQUEUE (25)[3, 17, 25][9]
DEQUEUE ()[17, 25][9, 3]3 在 17 和 25 之前插入。
DEQUEUE ()[25][9, 3, 17]17 在 25 之前插入。
ENQUEUE (16)[25, 16][9, 3, 17]
DEQUEUE ()[16][9, 3, 17, 25]25 在 16 之前插入。
DEQUEUE ()[][9, 3, 17, 25, 16]16 是最后一个元素。

输出序列将是 [9, 3, 17, 25, 16]。因此,(c) 是正确答案。


6) 评估给定中缀表达式的后缀表达式

A + B * C - (F + D) + E / G - H

  1. ABC*+FD+-EG/+H-
  2. ABC*+FD+-EG/-H+
  3. ABC*+FD+-EG/+H-
  4. ABC*+FD-+EG/-H+

答案: (c) ABC*+FD+-EG/+H-

说明

中缀到后缀转换的逐步过程如下表所示

输入符号操作Stack后缀表达式原因
ANullA
+Push (+)+A
B+AB
*Push (*)* +AB* 的优先级高于 +。
C* +ABC
-Pop () Pop () Push (-)-ABC*+- 的优先级低于 *,因此我们弹出 *,而 + 和 - 遵循从左到右的结合性,因此也弹出 +。
(Push (()( -ABC*+
F( -ABC*+F
+Push (+)+ ( -ABC*+F+ 的优先级低于 '(',因此我们将其压栈。
D+ ( -ABC*+FD
)Pop () Pop ()-ABC*+FD+一旦遇到 ')', 我们必须弹出直到遇到 '('。
+Pop () Push (+)+ABC*+FD+-+ 和 - 的优先级相同。并且遵循从左到右的结合性。因此,我们弹出 '-' 并压入 '+'。
E+ABC*+FD+-E
/Push (/)/ +ABC*+FD+-E/ 的优先级很高。
G/ +ABC*+FD+-EG
-Pop () Pop () Push (-)-ABC*+FD+-EG/+- 的优先级低于 /,而 + 先出现,因此我们弹出两者。
H-ABC*+FD+-EG/-H
NULLPop ()NULLABC*+FD+-EG/-H-

得到的后缀表达式是 ABC*+FD+-EG/-H-。因此,(c) 是正确答案。

要学习表达式从一种符号到另一种符号的转换,请遵循以下链接:

https://tpointtech.cn/convert-infix-to-postfix-notation


7) 当将数字 484 传递给以下函数时,输出是什么?

bool YOO (int n)

{

int x = 0;

for (int odd = 1; n > x; odd = odd + 2)

x = x + odd;

return (n == x);

}

它的通用目的是什么?

  1. True,检查给定数字是否为偶数
  2. False,检查给定数字是否能被 4 整除
  3. False,什么都不做
  4. True,检查输入是否为完全平方数

答案: (d) True,检查输入是否为完全平方数

解释: 提供的函数将每个奇数(1、3、5、7、9、......,依此类推)相加,直到总和小于或等于 n。如果总和等于 n,则函数返回 true。从某种意义上说,这是对精确平方数的测试。奇数的和可以用来表示任何完全平方数。例如:

1 = 1

4 = 1 + 3

9 = 1 + 3 + 5

16 = 1 + 3 + 5 + 7

484 可以写成 1 + 3 + 5 + 7 + 9 + 11 + ..... + 47。


8) 以下哪个是队列数据结构的应用程序?

  1. 当多个消费者共享单个资源时。
  2. 当信息异步交换时(信息不总是以与发送相同的速率接收),在两个进程之间。
  3. 负载均衡,
  4. 以上全部。

答案:(d) 以上均正确

说明

a. 当多个消费者共享同一资源时。CPU 调度和磁盘调度是两个例子。

b. 当信息在进程之间异步交换时(信息不总是以与发送相同的速率接收)。例如管道和 IO 缓冲区。

c. 通过分布式队列的负载均衡,可以平衡或分发消息加载到多个适配器服务之间。负载均衡可减少压力故障,并确保没有任何单个服务过载。通过避免单点故障,它还实现了容错。适配器配置的入站和出站两侧都可以以负载均衡的配置运行。

因此,(d) 是正确答案。


9) 关于队列的链表实现,以下哪个陈述是正确的?

I. 如果在入队操作期间在链表开头添加新节点,则在出队操作期间必须从末尾删除节点。

II. 如果在入队操作的末尾添加新节点,则在出队操作期间必须删除开头节点。

  1. 仅 I
  2. 仅 II
  3. I 和 II
  4. 既不是 I 也不是 II

答案: (c) I 和 II 都正确

说明

队列数据结构遵循“先进先出”原则。

在队列的链表实现中,如果在入队操作期间在链表开头添加节点,则在出队操作期间必须从链表末尾删除节点。或者,如果在入队操作期间在链表末尾添加节点,则在出队操作期间必须从链表开头删除节点。

以上陈述对于队列数据结构是 100% 正确的。

因此,(c) 是正确答案。


10) 考虑一个使用循环链表表示的队列。指针 p 用于访问队列的元素。为了实现 enQueue 和 deQueue 操作的常数时间执行,p 应该指向哪个节点?

  1. 队首节点
  2. 队尾节点
  3. 中间节点
  4. 至少需要两个指针

答案: (b) 队尾节点

说明

给出的图示表示了问题中提到的相同概念。

Computer Science Quiz - III: Part 1

当 'p' 指向队尾节点时,我们可以以常数时间 O(1) 执行 enQueue 和 deQueue 操作。

假设我们有一个新节点 (N)。

要执行队尾入队操作, 我们将 N -> next 设置为 p -> next

并将 p -> next 设置为 N。这可以在常数时间内完成,并且

要执行队首出队操作, 我们将 p -> next 设置为 p -> next -> next。通过这种方法将删除队首节点,可以在常数时间内完成。

因此,(a) 是正确答案。


11) 使用大小为 n 的数组来实现循环队列。假设 enQueue 操作在数组的队尾进行,deQueue 操作在数组的队首进行。此外,队尾和队首最初都等于零。识别用于检测队列满和空条件的条件。

  1. 满:Rear + 1 == n;空:Front == 0
  2. 满:(Rear + 1) mod n == Front;空:Front == 0
  3. 满:(Rear + 1) mod n == Front;空:(Front + 1) mod n == rear
  4. 满:(Rear + 1) mod n == Front;空:Front == Rear

答案: (d) 满:(Rear + 1) mod n == Front;空:Front == Rear

说明

当使用数组实现循环队列时,检测队列满的条件是 (Rear + 1 mod n = Front),检测队列空的条件是 Front == Rear。在两种情况下队列是满的

I:当 Rear 在 Front 之前时,即 Rear + 1 = Front

(Rear + 1) mod n 给出队首索引。

II:当 Rear == n - 1 且 Front == 0 时

Rear + 1 变为 n,而 (Rear + 1) mod n == n mod n == 0 == Front。

选项 (d) 满足这两个条件。因此,它是正确答案。

当队列不是循环的,第一个选项可能是有效的。


12) 考虑一个场景,其中每个集合都表示为链表,并且条目以任意顺序出现。涉及并集、交集、成员资格和基数的操作中,哪一个会最慢?

  1. 并集和交集
  2. 成员资格和并集
  3. 基数和交集
  4. 仅交集

答案: (c) 并集和交集

说明

  1. 求两个集合的并集 - 考虑两个用链表表示的集合 A 和 B。对于 A 的每个元素,我们必须将其与 B 中的每个元素进行比较。因此,求两个集合的并集的时间复杂度为 O (m * n),其中 m 和 n 分别是集合 A 和 B 的基数。
  2. 求两个集合的交集 - 在这里,我们还必须将 A 的每个元素与 B 中的每个元素进行比较。因此,求两个集合的交集的时间复杂度为 O (m * n)。
  3. 求集合的基数 - 我们只需遍历列表一次。因此,时间复杂度为 O (n)。
  4. 求成员资格 - 在这里,我们也只需要将给定元素与集合中的每个元素进行比较,在最坏的情况下,需要 n 次比较。因此,时间复杂度为 O (n)。

因此,(a) 是正确答案。


13) 如果只提供单向链表的第一个和最后一个节点的指针,以下哪个操作依赖于链表的长度?

  1. 删除链表的第一个节点
  2. 删除链表的最后一个节点
  3. 添加一个新节点作为第一个节点
  4. 在列表末尾添加一个新节点

答案: (b) 删除链表的最后一个节点

说明

  1. 通过简单地将头指针指向第二个节点,可以在常数时间内删除第一个节点。
  2. 删除最后一个节点取决于链表的长度。要删除最后一个节点,我们必须能够访问倒数第二个节点;为此,我们必须遍历整个列表,将最后一个指针指向倒数第二个节点,并将下一个指针设为 null。
  3. 通过将新节点的下一个指针指向头节点并更改头指针指向新节点,可以在常数时间内将新节点添加为第一个节点。
  4. 通过将最后一个节点的下一个指针指向新节点并将最后一个指针指向新节点,可以轻松地在常数时间内在列表末尾添加新节点。

因此,(b) 是正确答案。


14) 任意根到叶子路径上的最大边数决定了二叉树的高度。高度为 h 的二叉树中可能存在的最大节点数为

  1. 2h - 1
  2. 2h + 1
  3. 2h + 1 + 1
  4. 2h + 1 - 1

答案: (d) 2h + 1 - 1

解释: 如果一棵树是二叉树,那么树中的每个节点最多可以有两个子节点。二叉树的最大节点数可以使用 2h + 1 - 1 来确定。

因此,(d) 是正确答案。


15) 树中任意最长的根到叶子路径决定了树的高度。高度为 10 的二叉树的最大和最小节点数分别为

  1. 1024 和 10
  2. 1023 和 11
  3. 2048 和 10
  4. 2047 和 11

答案: (d) 2047 和 11

说明

二叉树的最大节点数可以使用 2h + 1 - 1 来确定。

最大节点数 = 2h + 1 - 1 = 210 + 1 - 1 = 2048 - 1 = 2047

二叉树的最小节点数可以使用 n + 1 来确定。

最小节点数 = n + 1 = 10 + 1 = 11

因此,(d) 是正确答案。


16) 考虑一棵有 63 个节点的二叉树。该树的最小和最大高度可能为

  1. 62 和 6
  2. 62 和 5
  3. 6 和 5
  4. 63 和 5

答案: (b) 62 和 5

说明

二叉树的最大高度和节点之间的关系是

n = h + 1。

63 = h + 1

h = 63 - 1 = 62

二叉树的最小高度和节点之间的关系是

n = 2h + 1 - 1。

63 = 2h + 1 - 1 => 63 + 1 = 2h + 1

64 = 2h + 1

26 = 2h + 1

6 = h + 1

h = 6 - 1 = 5

因此,(b) 是正确答案。


17) 考虑图中显示的二叉树,如果按前序、中序和后序遍历节点。以下哪个选项是正确的?

Computer Science Quiz - III: Part 1
  1. 前序:1, 2, 4, 7, 5, 10, 6, 3, 8, 9
    中序:1, 2, 3, 4, 5, 8, 9, 7, 10, 6
    后序:7, 4, 10, 6, 5, 2, 8, 9, 3, 1
  2. 前序:1, 2, 4, 7, 5, 10, 6, 3, 8, 9
    中序:7, 4, 2, 10, 5, 6, 1, 8, 3, 9
    后序:7, 10, 6, 4, 5, 8, 9, 2, 3, 1
  3. 前序:1, 2, 4, 7, 5, 10, 6, 3, 8, 9
    中序:7, 4, 2, 10, 5, 6, 1, 8, 3, 9
    后序:7, 4, 10, 6, 5, 2, 8, 9, 3, 1
  4. 前序:1, 2, 4, 7, 5, 10, 6, 3, 8, 9
    中序:7, 4, 2, 10, 5, 6, 1, 8, 3, 9
    后序:7, 4, 10, 6, 5, 2, 8, 9, 3, 1

答案: (d) 前序:1, 2, 4, 7, 5, 10, 6, 3, 8, 9

中序:7, 4, 2, 10, 5, 6, 1, 8, 3, 9

后序:7, 4, 10, 6, 5, 2, 8, 9, 3, 1

说明

在前序遍历中,我们首先遍历根节点,然后是其左子节点,然后是右子节点。

因此,正确的前序序列将是 1, 2, 4, 7, 5, 10, 6, 3, 8, 9。

在中序遍历中,我们首先遍历左子节点,然后是右子节点,最后是根节点。

因此,正确的中序序列将是 7, 4, 2, 10, 5, 6, 1, 8, 3, 9。

在后序遍历中,我们首先遍历左子节点,然后是右子节点,最后是根节点。

因此,正确的后序序列将是 7, 4, 10, 6, 5, 2, 8, 9, 3, 1。

因此,(d) 是正确答案。


18) 以下哪对遍历无法唯一确定一棵二叉树?

  1. 前序和中序
  2. 前序和后序
  3. 后序和中序
  4. 以上都不是

答案: (b) 前序和后序

说明

前序和后序序列不足以唯一确定一棵二叉树。

举个例子,一棵二叉树的前序和后序遍历分别是 123 和 321。

Computer Science Quiz - III: Part 1

在这里,两棵树具有相同的前序和后序序列。我们无法确定哪一个是真实的。前序和后序序列没有提供关于节点单个子节点的足够信息,无法区分它是左子节点还是右子节点。

为了唯一地构建一棵二叉树,中序序列是必需的。

因此,(b) 是正确答案。


19) 一个空的二叉搜索树按照指定的顺序填充以下整数:10, 1, 3, 5, 15, 12, 和 16。二叉搜索树有多高(高度是指最远叶子节点与根节点的距离,这意味着根节点在第 0 层)?

  1. 2
  2. 3
  3. 4
  4. 5

答案: (b) 3

说明

二叉搜索树的特点如下:

  • 节点左子树中只包含键小于该节点键的节点。
  • 节点右子树中只包含键大于该节点键的节点。
  • 二叉搜索树的左子树和右子树也必须是二叉搜索树。

在按照给定顺序插入给定整数后,我们得到以下二叉搜索树:

Computer Science Quiz - III: Part 1

二叉树的高度是 3。因此,(b) 是正确答案。


20) 与邻接矩阵格式相比,图的邻接列表表示提供了什么好处,特别是?

  1. 对于稀疏图,邻接列表形式节省了空间。
  2. 使用邻接列表表示的 DFS 和 BSF 可以在 O(V + E) 时间内完成。而在邻接矩阵形式的表示中,这些操作需要 O(V2) 时间。这里 V 和 E 分别是顶点的数量和边的数量。
  3. 在邻接列表表示中添加顶点比在邻接矩阵形式中更容易。
  4. 以上全部。

答案: (d) 以上所有选项。

说明

邻接矩阵: 在邻接矩阵表示中,图表示为二维数组。该数组的大小为 V x V,其中 V 是顶点的集合。

邻接列表: 在邻接列表格式中,图表示为链表数组。两个顶点之间的边由数组索引所代表的链表中的每个元素表示。

与邻接矩阵相比,邻接列表提供了所有提到的好处。

因此,(d) 是正确答案。