(完整版)算法设计与分析期末考试卷及答案a
一.填空题(每空 2 分,共30分)
1.算法的时间复杂性指算法中的执行次数。
2.在忽略常数因子的情况下,O、和三个符号中,提供了算法运行时间的一个上界。
3.设D n表示大小为n的输入集合,t(I)表示输入为I时算法的运算时间, p(I)表示输入
I 出现的概率,则算法的平均情况下时间复杂性A(n)= 。
4.分治算法的时间复杂性常常满足如下形式的递归方程:
f (n) d , n n0
f(n) af(n/c) g(n) , n n0
其中,g(n)表示。
5. 分治算法的基本步骤包括。6.回溯算法的基本思想是。
7.动态规划和分治法在分解子问题方面的不同点是。
8.贪心算法中每次做出的贪心选择都是最优选择。
9.PQ 式的分支限界法中,对于活结点表中的结点,其下界函数值越小,优先级
10.选择排序、插入排序和归并排序算法中,算法是分治算法。
11.随机算法的一个基本特征是对于同一组输入,不同的运行可能得到的结果。12. 对于下面的确定性快速排序算法,只要在步骤3 前加入随机
化步骤,就可得到一个随机化快速排序算法,该随机化步骤的功能是。
算法QUICKSORT
输入:n 个元素的数组A[1..n] 。
输出:按非降序排列的数组 A 中的元素
1. quicksort(1, n)
end QUICKSORT
_
_ 过程 quicksort(A, low, high)
_ _
// 对 A[low..high] 中的元素按非降序排序。
_
号 学
2. if low 3. w=SPLIT(A, low, high) 栏 _ //算法 SPLIT 以 A[low] 为主元将 A[low..high] 划分成两部 _ _ //分,返回主元的新位置。 名 姓 4. quicksort (A, low, w-1) 息 5. quicksort (A, w+1, high) 级 年 _ 6. end if 线 end quicksort 信 _ _ 13.下面算法的基本运算是 运 算, 该算法的时间复杂性阶 _ _ 为 ( ) 。 业 算法 SPLIT 专 _ 订 输入:正整数 n ,数组 A[1..n] 。 生 _ _ 输出:?。 _ _ i=1 考 _系 _ _ 装 x=A[1] _ _ for j=2 to n _ _ if A[j]<=x then _ 院 i=i+1 学 _ if i j then A[i] A[j] _ _ end if _ _ _ end for A[i] A[1] w =i return w, A end SPLIT 二.计算题和简答题(每小题7 分,共21分) 1.用O、、表示函数f 与g 之间阶的关系,并分别指出下列函数中阶最低和最高的函数: (1) f (n)=100 g(n)=100n (2) f(n)=6n+n log n g(n)=3n (3) f(n)= n/logn-1 g(n)= 2 n (4) f(n)= 2n n2g(n)=3n (5) f(n)= log3 n g(n)= log2 n 2.下面是一个递归算法,其中,过程pro1 和pro2 的运算时间分别是1 和log 2n 。给出该算法的时间复杂性T(n)满足的递归方程,并求解该递归方程,估计T(n)的阶(用表示)。 算法EX1 输入:正整数n,n=2k。输出:? ex1(n) end EX1 过程ex1(n) if n=1 then pro1(n) else 栏 名 姓 级 年 _ _ 系 _院 学 pro2(n) ex1(n/2) end if return end ex1 3.用Floyd 算法求下图每一对顶点之间的最短路径长度,计算矩阵D0,D1,D2和D3,其中D k[i, j]表示从顶点i到顶点j的不经过编号大于 k 的顶点的最短路径长 度。 三.算法填空题 (共 1.(10 分)设n 个不同的整数按升序存于数组A[1..n] 中,求使得A[i]=i 的下标i 。下面是求解该问题的分治算法。 算法SEARCH 输入:正整数n,存储n 个按升序排列的不同整数的数组 A[1..n] 。输出:A[1..n] 中使得A[i]=i 的一个下标i,若不存在, 则输出no solution。 i=find ( (1) ) if i>0 then output i else output “ no solution ” end SEARCH 过程find (low, high) // 求A[low..high] 中使得A[i]=i 的一个下标并返回,若不存在, 输出:n 个矩阵链乘所需的数量乘法的最少次数。 for i=1 to n C[i, i]= (1) for d=1 to n-1 for i=1 to n-d _j= (2) __ _C[i, j]= ∞ 号学for k=i+1 to j _栏__ _x= (3) __if x _(4) =x _ 名end if 息姓 end for end for 级 年线end for _信_ _return (5) _ _end MATCHAIN 业3.(14 分)下面是用回溯法求解马的周游问题的算法。 生专 _订 马的周游问题:给出一个nxn 棋盘,已知一个中国象棋马在 _ _棋盘上的某个起点位置(x0, y0),求一条访问每个棋盘格点恰好_ _ 一次,最后回到起点的周游路线。(设马走日字。) 考_系算法HORSETRAVEL _装 __ _ 输入:正整数n,马的起点位置(x0, y0),1<=x0, y0<=n 。 __ 输出:一条从起点始访问nxn 棋盘每个格点恰好一次,最后回到起 _院点的周游路线;若问题无解,则输出no solution。 学 tag[1..n, 1..n]=0 _ dx[1..8]={2, 1, -1, -2, -2, -1, 1, 2} _dy[1..8]={1, 2, 2, 1, -1, -2, -2, -1} _flag=false 四.算法设计题( 15 分) 1. 一个旅行者要驾车从 A 地到 B 地,A 、B 两地间距离为 s 。A 、B 两 地之间有 n 个加油站,已知第 i 个加油站离起点 A 的距离为 d i 公里, 0=d 1 d 2 d n s ,车加满油后可行驶 m 公里,出发之前汽车 油箱为空。应如何加油使得从 A 地到 B 地沿途加油次数最少?给出 用贪心法求解该最优化问题的贪心选择策略,写出求该最优化问题 的最优值和最优解的贪心算法,并分析算法的时间复杂性。 线 线 订 装 《算法设计与分析》期考试卷 (A) 标准答案 一. 填空题: 1. 元运算 _ 栏 _ _ _ 名 姓 息 级 年 _ _ _ 信 __ 信 __ _ _ _ 业 专 生 __ _ _ _ _ _ _ 系 _ 考 __ _ _ __ 2. O 3. p(I)t(I) I D n 4. 将规模为 n 的问题分解为子问题以及组合相应的子问题的解所需的时间 5. 分解,递归,组合 6. 在问题的状态空间树上作带剪枝的 DFS 搜索(或: DFS+ 剪枝) 7. 前者分解出的子问题有重叠的,而后者分解出的子问题是相互独立(不重叠)的 8. 局部 9. 高 10. 归并排序算法 11. 不同 12. v=random (low, high); 交换 A[low] 和 A[v] 的值 随机选主元 13. 比较 n 二. 计算题和简答题: 1. 阶的关系: (1) f(n)= O(g(n)) (2) f(n)= (g(n)) (3) f(n)= (g(n)) (4) f(n)= O(g(n)) (5) f(n)= (g(n)) 阶最低的函数是: 100 T(n) 1 T(n) T(n/2) log 2n , n 1 将 n= 2k , a=1, c=2, g(n)= log 2n , d=1 代入该类递归方程解的一般形式得: =1+ k log 2 n - k(k 1) 1 = log 22 n + 1 log 2 n +1 2 2 222 所 以, 1 T(n)= log 2 2 22 n 1 + 2log 2 n +1= (log 2 n) 。 3. 2 2 0 2 D 0 3 0 6 D 1 3 0 5 D 2 3 0 5 10 5 10 50 8 5 0 T(n)=1+ i 0 2 i 0 阶最高的函数是: 3n 2. 该递归算法的时间复杂性 T(n)满足下列递归方程: n1 k 1 k 1 n log 2 i =1+k log 2 n - i 072 D 3 3 0 5 850 . 算法填空题: 四. 算法设计题: 1. 贪心选择策略:从起点的加油站起每次加满油后不加油行驶尽可能远,直至油箱中的油 耗 尽前所能到达的最远的油站为止,在该油站再加满油。 算法 输 入: MINSTOPS A 、B 两地间的距离 s ,A 、B 两地间的加油站数 n ,车加满油后可行驶的公里数 m ,存储各加油站离起点 A 的距离的数组 d[1..n] 。 输出: 从 A 地到 B 地的最少加油次数 k 以及最优解 x[1..k] ( x[i] 表示第 i 次加油的加油 站序号),若问题无解,则输出 no solution 。 d[n+1]=s; //设置虚拟加油站第 n+1 站。 for i=1 to n if d[i+1] -d[i]>m then output “ no solution ” ; /r/e 无tu 解rn , 返回 end if end for k=1; x[k]=1 //在第 1 站加满油。 s1=m //s1 为用汽车的当前油量可行驶至的地点与 A 点的距离 i=2 while s1 if d[i+1]>s1 then // 以汽车的当前油量无法到达第 i+1 站。 k=k+1; x[k]=i // 在第 i 站加满油。 s1=d[i]+m // 刷新 s1 的值 end if i=i+1 end while output k, x[1..k] MINSTOPS 最坏情况下的时间复杂性:Θ (n) 1. (1) 1, n (4) mid+1, high (2) low>high (5) find(low, mid -1) (3) A[mid]=mid 2. (1) 0 (2) i+d (3) C[i, k -1]+C[k, j]+r[i]*r[k]*r[j+1] (4) C[i, j] (5) C[1, n] 3. (1) i>=1 (4) i+1 (7) x=x-dx[k[i]]; (2)k[i]+1 (5) k[i]=0 y=y-dy[k[i]] (3) 1 (6) tag[x, y]=0