以下问题已在 GATE CS 考试中提出。
1.考虑下面的C程序段
c
struct CellNode
{
struct CelINode *leftchild;
int element;
struct CelINode *rightChild;
}
int Dosomething(struct CelINode *ptr)
{
int value = 0;
if (ptr != NULL)
{
if (ptr->leftChild != NULL)
value = 1 + DoSomething(ptr->leftChild);
if (ptr->rightChild != NULL)
value = max(value, 1 + DoSomething(ptr->rightChild));
}
return (value);
}
c
int recursive (mt n)
{
if (n == 1)
return (1);
else
return (recursive (n-1) + recursive (n-1));
}
当指向非空树的根的指针作为参数传递时,函数DoSomething 返回的值是 (GATE CS 2004)
a) 树中叶节点的数量
b) 树中的节点数
c) 树中内部节点的数量
d) 树的高度
答案: (d)
说明: DoSomething() 返回 max(左孩子的高度 + 1,左孩子的高度 + 1)。因此,将指向树根的指针传递给 DoSomething(),它将返回树的高度。请注意,此实现遵循单个节点的高度为 0 的约定。
2.假设我们在下面以顶点P为源的边加权有向图上运行Dijkstra的单源最短路径算法。节点以什么顺序包含在确定最短路径距离的顶点集中? (GATE CS 2004)
a) P、Q、R、S、T、U
b) P、Q、R、U、S、T
c) P、Q、R、U、T、S
d) P、Q、T、R、U、S
答案(二)
3. 假设每个集合都表示为一个链表,其中元素的顺序是任意的。 union、intersection、membership、cardinality 中哪个操作最慢? (GATE CS 2004)
a) 仅工会
b) 交集、成员资格
c) 成员资格、基数
d) 并集、交集
答案: (d)
基数和成员资格绝对不是最慢的。对于基数,只需计算列表中的节点数。对于成员资格,只需遍历列表并查找匹配项
为了得到 L1 和 L2 的交集,在 L2 中搜索 L1 的每个元素并打印我们在 L2 中找到的元素。
有很多方法可以得到 L1 和 L2 的并集。其中之一如下
a) 打印 L1 的所有节点,只打印 L2 中不存在的节点。
b) 打印 L2 的节点。
4. 以下 C函数的时间复杂度为(假设 n > 0 (GATE CS 2004)
C
int recursive (mt n)
{
if (n == 1)
return (1);
else
return (recursive (n-1) + recursive (n-1));
}
a) 0(n)
b) 0(nlogn)
c) 0(n^2)
d) 0(2^n)
答案: (d)
解释:
上述程序的递归表达式将是。
T(n) = 2T(n-1) + c
T(1) = c1.
让我们解决它。
T(n) = 2(2T(n-2) + c) + c = 4T(n-2) + 3c
T(n) = 8T(n-3) + 6c + c = 8T(n-3) + 7c
T(n) = 16T(n-4) + 14c + c = 16T(n-4) + 15c
...................................................
...................................................
T(n) = (2^(n-1))T(1) + (2^(n-1) - 1)c
T(n) = O(2^n)