📜  数据结构和算法 | 21套

📅  最后修改于: 2021-09-28 09:54:13             🧑  作者: Mango

以下问题已在 GATE CS 2008 考试中提出。

1. 子集和问题定义如下。给定一组 n 个正整数,S = {a1 ,a2 ,a3 ,…,an} 和正整数 W,是否存在 S 的子集,其元素和为 W?解决此问题的动态程序使用二维布尔数组 X,具有 n 行和 W+1 列。 X[i, j],1 <= i <= n, 0 <= j <= W, 为真当且仅当存在 {a1 ,a2 ,…,ai} 的子集,其元素和为 j .以下哪项对 2 <= i <= n 和 ai <= j <= W 有效?
(A) X[i, j] = X[i – 1, j] VX[i, j -ai]
(B) X[i, j] = X[i – 1, j] VX[i – 1, j – ai]
(C) X[i, j] = X[i – 1, j] VX[i, j – ai]
(D) X[i, j] = X[i – 1, j] VX[i -1, j – ai]

答案 (B)

X[I, j] (2 <= i <= n and ai <= j <= W),如果以下任何一项为真,则为真 1) 不包括 ai 的权重总和等于 j,即,如果 X[ i-1, j] 为真。 2) 包含ai 的权重总和等于j,即,如果X[i-1, j-ai] 为真,那么我们得到(j – ai) + ai 作为j。 2. 在问题 1 中,数组 X 的哪个条目,如果为 TRUE,意味着存在一个子集,其元素和为 W?
(A) X[1, W]
(B) X[n ,0]
(C) X[n, W]
(D) X[n -1, n]

答案 (C)
如果我们得到条目 X[n, W] 为真,那么存在一个 {a1, a2, .. an} 的子集,其总和为 W。

参考:http://en.wikipedia.org/wiki/Subset_sum_problem

3. 考虑以下 C 程序,该程序尝试使用二分搜索定位数组 Y[] 中的元素 x。程序是错误的。

1.   f(int Y[10], int x) {
2.     int i, j, k;
3.     i = 0; j = 9;
4.     do {
5.             k =  (i + j) /2;
6.             if( Y[k] < x)  i = k; else j = k;
7.         } while(Y[k] != x && i < j);
8.     if(Y[k] == x) printf ("x is in the array ") ;
9.     else printf (" x is not in the array ") ;
10. }

程序在 Y 和 x 的下列哪个内容上失败?
(A) Y 是 [1 2 3 4 5 6 7 8 9 10] 并且 x < 10 (B) Y 是 [1 3 5 7 9 11 13 15 17 19] 并且 x < 1 (C) Y 是 [2 2 2 2 2 2 2 2 2 2] 和 x > 2
(D) Y 是 [2 4 6 8 10 12 14 16 18 20] 并且 2 < x < 20 并且 x 是偶数答案 (C) 上述程序不适用于要搜索的元素是最后一个元素的情况Y[] 或大于 Y[] 中的最后一个元素(或最大元素)。对于这种情况,程序会进入无限循环,因为在所有迭代中 i 都被赋值为 k,并且 i 永远不会等于或大于 j。所以 while 条件永远不会变成假。
4. 在问题 3 中,程序中需要进行的更正才能使其正常工作

(A) 将第 6 行改为: if (Y[k] < x) i = k + 1;否则 j = k-1; (B) 将第 6 行改为: if (Y[k] < x) i = k – 1;否则 j = k+1; (C) 将第 6 行更改为: if (Y[k] <= x) i = k;否则 j = k; (D) 将第 7 行更改为: } while ((Y[k] == x) && (i < j));答案 (A) 下面是修正后的函数

f(int Y[10], int x) {
   int i, j, k;
   i = 0; j = 9;
   do {
           k =  (i + j) /2;
           if( Y[k] < x)  i = k + 1; else j = k - 1;
       } while(Y[k] != x && i < j);
   if(Y[k] == x) printf ("x is in the array ") ;
   else printf (" x is not in the array ") ;
}

参考:http://en.wikipedia.org/wiki/Binary_search_algorithm#Implementations

请参阅 GATE Corner 了解所有往年论文/解决方案/解释、教学大纲、重要日期、笔记等。