算法设计与分析试题(三合一)答案
算法分析与设计模拟试题一答案
一、填空题答案(每小题4分,共计40分) 1. 最坏、最好、平均、最坏
2.
、 3. 常数因子
4. 直接或间接地调用自身、用函数自身给出定义
5. 最好、局部最优选择
6. 贪心选择性质、最优子结构性质
7. 贪心算法、动态规划算法
8. 较小、互相独立、相同、合并
9. 最优子结构(性质)、子问题重叠(性质) 10.动态规划算法、贪心算法。
二、简答题答案(每小题10分,共计40分)
1. 如果只需要求解问题的最优值,动态规划算法步骤如下: (1)找出最优解的性质,并刻画其结构特征; (2)递归地定义最优值;
(3)以自底向上的方式计算出最优值; 如果需要构造最优解,则还需要加上如下步骤: (4)根据计算最优值时得到的信息,构造最优解。
2. 所谓贪心选择性质是指,所求问题的全局最优解可以通过一系列局部最优选择,即贪心选择来达到。
3. 如果G 的子图G ’是一棵包含G 的所有顶点的树,则称G ’为G 的生成树。
生成树上各边权的总和称为该生成树的耗费。
在G 的所有生成树中,耗费最小的生成树称为G 的最小生成树。
4. 动态规划算法需要知道所有子问题的解,而贪心算法不需要知道所有子问题的解,它只是在每一步迭代中选择看起来最好的解,并不从整体进行最优考虑,因此效率较高。
三、算法分析和设计题答案(每小题10分,共计20分) 1. 汉诺塔问题的递归算法如下:
public static void Hanoi(int n, int a, int b, int c) {
if( n>0 )
{
Hanoi( n-1, a,c,b ); Move( a, b ); Hanoi( n-1, c,b,a );
} }
2. 算法如下:
输入:正整数n 和存储n 个元素的数组a[1..n],被搜索的元素x )(2n O )(log n O
输出:若x 在数组中则返回其下标否则返回0
i=binarysearch(1,n,a,x); return I;
end BINARYSEARCH1 过程 binarysearch(low,high,a,x)
//在数组a 的下标为low 到high 范围内寻找x, //若找到x 则返回其下标否则返回0 if low>high then return 0; else mid=
[]2/)(high low +;
if a[mid]=x then
return mid;
else if a[mid]<x then
return binarysearch(low,mid-1,a,x); else return binarysearch(mid+1,high,a,x); end if end if
算法分析与设计模拟试题二答案
一、填空题答案(每小题4分,共计40分) 1. 程序设计语言、有限性 2. 最坏
3. 递归算法、递归函数
4. 贪心算法、动态规划算法
5.
、O(C n ) 6.
、、、
7. 分治策略、已排好序、
、
8. 最优子结构(性质)、子问题重叠(性质) 9. 自顶向下、自底向上 10. 贪心算法、动态规划算法。
二、简答题答案(每小题10分,共计40分) 1. 分治算法的一般步骤:
分解 → 直接或递归求解子问题 → 组合 递归方程
分治算法的时间复杂性C(n)往往满足如下的递归方程:
)(2n O n
log n 2025n 3
n )
(log n O )
(n O ⎩⎨
⎧>+===0
0n n , )()()(n ,
)(n g c n aC n C n d n C
其中,n: 问题的规模。
n 0: 可直接解的问题规模的阈值。
a: 分解出的需要求解的子问题的个数。
n/c: 分解出的子问题的规模。
g(n): 分解规模为n 的问题以及组合相应子问题的解 所需的时间。
d: 直接解规模为n 0的问题所需的时间。
2. 0-1背包问题的形式化描述是:
3. 贪心算法的简要求解步骤如下:
① 将优化问题转化成这样的一个问题,即先做出选择,再解决剩下的一个子问题。
② 证明原问题总是有一个最优解是做贪心选择得到的,从而说明贪心选择的安全性。
③ 说明在做出贪心选择后,剩余的子问题具有这样的一个性质,即如果将子问题的最优解和我们所
做的贪心选择联合起来,可以得出原问题的一个最优解。
4. 归并排序的基本思想是:
将待排序的序列分成长度大致相等的两个子序列,分别对2个子序列进行排序,最终将2个已排好序的子序列合并为有序的完整序列。
三、算法分析和设计题答案(每小题10分,共计20分) 1. Fibonacci 数列的递归定义式是:
第n 个Fibonacci 数可以递归计算如下:
public static int Fibonacci(int n) { if( n<=1 ) return 1;
return Fibonacci(n-1) + Fibonacci(n-2) ;
}
2. 二分搜索算法的java 语言描述如下: public static int BinarySearch(int[ ] a, int x, int n) {
int left=0; int right=n-1; while(left<=right) {
int middle = (left+right)/2; if(x==a[middle]) return middle; if(x>a[middle]) left = middle+1; ⎩⎨
⎧
>=-+-=11,0)2()1(1)(n n n F n F n F 当当
Else right = middle-1;
}
return -1;
}
算法分析与设计模拟试题三答案
一、填空题答案(每小题4分,共计40分)
1. 输入、输出、确定性、有限性
2. 时间、空间(即存储器)、时间复杂性、空间复杂性
3. 将待求解问题分解为若干个子问题、子问题、互相独立
4. 类名、数据成员、方法、访问修饰
5. ADT、数据模型、运算
6. O(f+g)、O(fg)
7. 较小、分而治之
8. 子问题
9. 贪心选择性质
10. 完全二叉树。
二、简答题答案(每小题10分,共计40分)
1.对于部分背包问题,依照贪心选择策略,可以得到最优解。
而0-1背包问题,贪心选择之所以不能得到最优解,是因为在这种情况下,它无法保证最终能将背包装满,部分闲置的背包空间使每公斤背包空间的价值降低了。
因而我们选择的判断标准出现了误差。
2. 相应的矩阵链相乘的最优完全加括号方式为
((A1(A2A3))(A4(A5A6)))
3. 哈夫曼树
哈夫曼编码:
4. 可以按以下步骤来设计动态规划算法:
(1)找出最优解的性质,并刻画其结构特征;
(2)递归地定义最优值;
(3)以自底向上的方式计算出最优值;
(4)根据计算最优值时得到的信息,构造最优解。
三、算法分析和设计题答案(每小题10分,共计20分)
1. 阶乘n!的递归定义式是:
n!可以递归计算如下:
public static int factorial(int n)
{
if( n==0 ) return 1;
return n * factorial(n-1) ;
}
2. 两种算法的求解过程描述如下:
(1)Prim算法
(2)Kruskal算法
⎩
⎨
⎧
>
=
-
=
)!
1
(
1
n
n
n
n
n!。