各字符的Huffman编码:
A: 01 B:1000 C: 1001 D: 11 E:00 F: 101 三. 算法填空题:
1. (1) rc>0 and i<=n (2) s[j]<=rc (3) rc/s[j] (4) rc=0 (5) maxv+v[j]*x[j]
2. (1) x[k] 3. (1) –1 (2) coinchanging(k-i*c[j], j-1) (3) i (4) minx (5) i0 (6) s[k, i] (7) k-x[i]*c[i] 四. 算法设计题: 1. 算法 RANDOMIZEDSELECT 输入:整数n, k, 1<=k<=n, 以及n个元素的整数数组A[1..n]。 输出:A中的第1~k小元素。 rselect ( A , 1, n, k ) end RANDOMIZEDSELECT 过程 rselect ( A , low, high, k ) //求A[low..high]中的前k小元素并输出。 v=random(low, high) mm=A[v] 将A[low..high]分成三个数组: A1={a|a if |A1|>=k then rselect (A1,1, |A1|, k) else if |A1|+|A2|>=k then 输出A1的所有元素以及k-|A1|个mm值 else 输出A1和A2的所有元素 rselect (A3,1, |A3|, k-|A1|-|A2| ) end if 26 end if return end rselect 福建师范大学数学与计算机科学学院 2006 — 2007学年第二学期考试 A 卷 该算法的时间复杂性的阶是?(n)。 27 栏 息 信 生 专 业:计算机科学与技术 年 级: 2005级 课程名称: 算法设计与分析 任课教师: 潘日晶 试卷类别:开卷( )闭卷(√) 考试用时: 120 分钟 考试时间: 2007 年 1 月 13 日 下 午 18 点 30 分 题号 一 二 三 四 五 总得分 评卷人 得分 题号 六 七 八 九 十 得分 一.填空题(每空2分,共30分) 1.算法的时间复杂性指算法中 的执行次数。 2.在忽略常数因子的情况下,O、?和?三个符号中, 提供了的一个上界。 3.设Dn表示大小为n的输入集合,t(I)表示输入为I时算法的运算时间I出现的概率,则算法的平均情况下时间复杂性A(n)= 4.分治算法的时间复杂性常常满足如下形式的递归方程: ?f(n)?d , n?n?0?f(n)?af(n/c)?g(n) , n?n 0 其中,g(n)表示 。 5. 分治算法的基本步骤包括 。 6.回溯算法的基本思想是 。 7.动态规划和分治法在分解子问题方面的不同点是 。8.贪心算法中每次做出的贪心选择都是 最优选择。 9.PQ式的分支限界法中,对于活结点表中的结点,其下界函数值越越 。 10.选择排序、插入排序和归并排序算法中, 算法是分治算 11.随机算法的一个基本特征是对于同一组输入, 不同的运行可能得到结果。 12.对于下面的确定性快速排序算法,只要在步骤3前加骤 28 ,就可得到一个随机化快速排序算步骤的功能是 。 , 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?logn? g(n)=3n (3) f(n)= n/logn-1 g(n)=2n (4) f(n)=2n?n2 g(n)=3n (5) f(n)= log3n g(n)= log2n 2.下面是一个递归算法,其中,过程pro1和pro2的运算时间分别是1和log2n。给出该算法的时间复杂性T(n)满足的递归方程,并求解该递归方程,估计T(n)的阶(用?表示)。 算法 EX1 输入:正整数n,n=2k。 输出:… ex1(n) end EX1 过程 ex1(n) if n=1 then pro1(n) else 29 _____号学 _栏_ _ _ _ _ 名 姓息 级 年 _信_ _ _ _ _ 业 生专 _ _ _ _ _ _考系______院学______ pro2(n) ex1(n/2) end if return end ex1 3.用Floyd算法求下图每一对顶点之间的最短路径长度,计算矩阵D0,D1,D2和D3,其中Dk[i, j]表示从顶点i到顶点j的不经过编号大于k的顶点的最短路径长度。 线 三.算法填空题(共34分) 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的一个下标并返回,若不存在, 30