1、 1 装订线华南农业大学期末考试试卷(A 卷) 2012学年第1学期 考试科目: 算法设计与分析 考试类型:(闭卷)考试 考试时间: 120 分钟 学号 姓名 年级专业 题号 一(20) 二(25) 三(16) 四(24) 五(15) 总分 得分 评阅人 说明: (1)请勿漏填学号姓名等信息。本试卷仅一份,请将答案直接填于试卷上,莫将试卷当草稿,想好了再写,若空白的位置不够,标注清楚后可以写反面; (2)答题时,对算法的描述可以采用文字、公式、图、伪代码、实例说明等混合形式。请注意表达应条理清晰,思想简洁,勿长篇累述不得要领。 得分 一、填空题(13题每空1分,第4题每空2分,共20分,结果直
2、接填于划线处) 1、化简下面f(n)函数的渐进上界表达式。(5分) nnnf 32/)(21 , 则 _)(_)(1OnfO 322)(nnf , 则 _)(_)(2OnfO 33log)( nnf , 则 _)(_)(3OnfO 2log42)(nnf , 则 _)(_)(4OnfO nnf 3log)(5 , 则 _)(_)(5OnfO 参考解答: )3()(1nOnfO ; )2()(2nOnfO ; )(log)(3nOnfO ; )()(24nOnfO ; )()(5nOnfO 。 2、用大O符号和关于n的渐进函数来表征如下算法Loop1至Loop3的运行时间。(3分) 算法1:O(
3、 ); 算法2:O( ); 算法2 Loop2(n) s=0; for(i=1;ix,将y插入堆中并重新整合成最小堆和形成新的堆顶元素x;否则丢弃y。当后续n-i个元素全部比较完毕,则最小堆中的i个元素即为原序列n个数中最大的i个数,最后对这堆中的i个数调用i次extract_Min过程即可有序输出。 请分析A、B、C、D和E这五个算法在最坏情况下的渐进时间复杂性(用n和i表示,但需化简,即忽略系数且略去低阶项)。 算法A: _)(_)( OnTA ; 算法B: _)(_)( OnTB ; 算法C: _)(_)( OnTC ; 算法D: _)(_)( OnTD ; 算法E: _)(_)( On
4、TE 。 参考解答:算法A: )()( niOnTA ; )log()( innOnTB 或 )log()( nnOnTB )log()( ninOnTC ,其中建立堆需要)(nO ,i次堆顶元素删除 )log( niO 。 算法3 Loop3(n) s=0; for(i=1;i0) b+=ai; else b=ai; if(bsum) sum=b; return sum; 7 装订线 int MaxSum2(int m, int n, int *a) /求解二维整数数组的最大子矩阵和 int sum=0; int *b=new intn; for(int i=0;isum) sum = ma
5、x; return sum; (4) (5) 参考解答: (4) bk+=ajk; (5) MaxSum(n,b); 3、“子集和问题”是求解:n个元素的整数集合,是否能找到一个子集,使得子集元素之和为c。其回溯搜索算法框架Backtrack( )如下,请补充完整。 void Backtrack(int i) /子集树的搜索算法,根节点,i=1 if(in) /搜索到子集树的叶子 if (cw = c) found=1; /cw为当前的子集之和,found已被初始化为false else found=0; /found是一个寻找标志,找到则为true,否则为false return; if(f
6、ound=0) /无条件左子树 xi = 1; cw += ai; Backtrack(i+1); (6) ; /搜索完左子树,无条件右子树 xi = 0; (7) ; (6) (7) 参考解答: (6) cw -= ai; (7) Backtrack(i+1); 4、“n皇后问题”是求解:nn的棋盘上放置n个不同行不同列不同斜线的皇后,是否有放置方案,有请输出可行的放置方案数。其算法框架nQueen( )如下,请补充完整。 int nQueen() /假定n,sum,x数组等都为全局变量,并在nQueen中初始化; 8sum=0; for(int i=1; in) /搜索到n叉树的叶子 su
7、m+; /sum为可行放置方案个数的统计变量 /并输出x解向量,此处略 else for(int i=1; i=w1 else m1xy=0; for(i=2;i=wi else mixy = (12) ; return mncd; (11) (12) 参考解答: (11) mixy = mi-1 x-wi y-bi + vi; (12) mixy = mi-1xy; 得分 五、算法设计题(共2小题,共15分) 此大题请写出算法设计的详细步骤,可用伪代码、文字、图表来描述。 1、【区间相交问题】(7分) 给定数轴上n个区间。去掉尽可能少的区间,使剩下的区间都不相交。请给出删除区间的方案。(这里
8、:两区间仅边界有交点不算相交) 参考解答:区间相交问题基本等同于活动安排问题。 1)、将区间按照区间后端点排序(从小到大)。 2)、选择第一个区间 3)、依次扫描后续区间,和第一个不相交的,拉入相容区间集合 4)、总区间数减去相容区间集合得到的就是最少的需要去掉的区间数 评分准则: 1) 答到贪心算法,且贪心算法表述正确,本题即可得满分; 2) 说明用到贪心算法,但表述不正确或含糊,扣2分以上; 3) 未提及贪心算法,但有解题思路,若错误,扣一大半分数,若正确,扣一半,因为贪心算法在这个问题中求解的效率最高; 10 其它情况酌情考虑。 2、【最长上升子序列问题】(8分) 对于给定的一个序列 1
9、00001),.,(21 NaaaN。我们可以得到一些递增上升的子序列。比如,对于序列(1, 7, 3, 5, 9, 4, 8),有它的一些上升子序列,如(1, 7), (3, 4, 8)等等。这些子序列中最长的长度是4,比如子序列(1, 3, 5, 8)。你的任务:对于给定的序列,求出最长上升子序列的长度。要求写出算法思想和递推公式,并分析算法时间复杂度。 参考解答:设f(i)表示:从左向右扫描过来直到以ai元素结尾的序列,获得的最长上升子序列的长度,且子序列包含ai元素(1in)。 1 1( ) max ( ) 1: ;1 11 1; (1 ) if i f j a i a j j i i
10、i j j i a i a j 当,都有即,f(i)是从f(1), f(2),f(i-1)中找最大的一个值,再加1。或者就是1。主要是看ai这个元素能否加入到之前已经获得的最长上升子序列,如果能加入,是之前已获得的最长上升子序列长度加一;如果不能加入,就取这最后一个元素作为一个单独子序列,长度为1。 最后,所要求的整个序列的最长公共子序列长度为maxf(i): 1=i=n 例如,对于序列:4 2 6 3 1 5 2 i 1 2 3 4 5 6 7 array 4 2 6 3 1 5 2 f(i) 1 1 2 2 1 3 2 评分准则: 1) 答到使用动态规划算法,并且推导出动态规划算法的递推函数公式表达,边界设定清晰,本题即可得满分;(阅卷时仔细看递推公式表达,公式表达含义正确即可,因其表达形式可能不唯一) 2) 说明使用动态规划算法,但对递推函数表达错误或含糊,扣2分以上; 其它情况酌情考虑。