数据结构和算法 | 34套
以下问题已在 GATE CS 2014 考试中提出。
1) 考虑下面给出的伪代码。函数DoSomething() 将指向由 leftMostChild-rightSibling 表示形式表示的任意树的根的指针作为参数。树的每个节点都是 treeNode 类型。
typedef struct treeNode* treeptr;
struct treeNode {
treeptr leftMostChild, rightSibling;
};
int DoSomething (treeptr tree) {
int value = 0;
if (tree != NULL) {
if (tree->leftMostChild == NULL)
value = 1;
else
value = DoSomething(tree->leftMostChild);
value = value + DoSomething(tree->rightSibling);
}
return(value);
}
当指针树的根作为参数DoSomething的传递,则返回值由函数对应于
(A) 树中内部节点的数量。
(B) 树的高度。
(C) 树中没有右兄弟节点的节点数。
(D) 树中叶节点的数量。
答案:(D)
在这个问题中要注意的重要一点是树的表示。树表示为最左边的孩子和右边的兄弟形式。因此,如果节点的最左边的子节点为 NULL,则该节点没有子节点。如果我们看一下函数,我们可以注意到该函数仅将叶节点的“值”增加 1。
2) 假设发现了一个多项式时间算法,它可以正确计算给定图中的最大集团。在这种情况下,以下哪一项代表复杂性类 P、NP 和 NP Complete (NPC) 的正确维恩图?
(一) A
(乙)乙
(C)丙
(四)丁
答案:(D)
最大集团是一个 NP 完全问题。如果一个NP完全问题可以在多项式时间内解决,那么它们都可以。所以NPC集合变成等于P。
以下是填空题
3)找出最小和最大 100 个数字所需的最小比较次数是 _________________。
答案:147
对于 n 个数字,所需的最少比较次数为 3n/2 – 3。有关更多详细信息,请参阅使用最少比较次数的数组的最大值和最小值的方法 3。
4)考虑两个字符串A = “qpqrr” 和 B = “pqprqrp”。设 x 是 A 和 B 之间最长公共子序列(不一定是连续的)的长度,让 y 是 A 和 B 之间最长公共子序列的数量。那么 x + 10y = ___。
答案:34
最长的长度是4。长度为4“qprr”、“pqrr”和“qpqr”的LCS有3个。
5)假设 P、Q、R、S、T 分别是长度为 20、24、30、35、50 的排序序列。通过一次将两个序列合并在一起,将它们合并为一个序列。执行此操作的最佳算法在最坏情况下所需的比较次数是____。
答案:358
要合并两个大小为 m 和 n 的列表,我们需要在最坏情况下进行 m+n-1 次比较。由于我们需要一次合并 2 个,因此最佳策略是首先采用最小大小的列表。选择最小的两个项目的原因是为了在合并中携带最少的项目重复。
我们首先合并 20 和 24,并使用 43 个最坏情况比较得到 44 个列表。然后我们使用 64 个最坏情况比较将 30 和 35 合并到 65 个列表中。然后我们使用 93 次比较将 50 和 44 合并为 94 的列表。最后,我们使用 158 次比较合并 94 和 65。所以比较的总数是 43 + 64 + 93 + 158,也就是 358。
查看 GATE Corner 了解所有往年论文/解决方案/解释、教学大纲、重要日期、笔记等。