国科大算法分析与设计 陈玉福_算法分析与设计期末复习

算法分析与设计期末复习

1. 问答题(30分5道或6道)

概念(集中在第一章概论)、主要算法思想(分治法、蛮力法、回溯法、分支限界法、贪心算法、动态规划)

2. 计算题(30分,两部分,一部分求准确界,或着说上界下界,判断两个式子是什么关系、一部分递推式的计算)

算法复杂度分析:两个算法上界、下界、准确界(等阶)

递归算法、递推式的复杂度的计算(书上2.5P74页)

3. 算法分析题(40分4道)

大部分是书上已有的例子、不同的方法

只要求把算法的主要步骤写出来、程序可以不写,可以不写源代码

只要把算法的主要步骤,用伪代码的形式写出来就可以了

计算题:
(1)如果f(n)=Θ(g(n)),则f(n)=O(g(n))且f(n)=Ω(g(n))。

(2)如果f(n)= o (g(n)),则f(n)=O(g(n))。

(3)如果f(n)=ω(g(n)),则f(n)=Ω(g(n))。

因此对于这些渐近记号的使用最准确应该是“f(n)∈ O (g(n))”,但是一般都是写成“f(n)=O(g(n))”。

给出一些例子:

O(n^2)可以是n,2n,1,2n^2等。

Θ(n^2)可以是n^2,3n^2等。

ω(n^2)可以是n^3,n^10等,但不能是n^2。

Ω(n^2)可以是n^2,n^3,n^10等。

o(n^2)可以是n,1,3n等,但不能是n^2。

主定理对于T(n) = aT(n/b) + f(n)(a ≥ geq≥ 1、 b > 1),比较f(n) 与nlogba - ε varepsilonε的大小,有如下三种结论:

· Case1:若存在ε varepsilonε > 0,使得f(n) = O(nlogba - ε varepsilonε),则T(n)存在确界nlogba,即T(n) = O(nlogba);

· Case2:若存在k ≥ geq≥ 0,使得f(n) = θ(nlogba * logbkn),则T(n)存在确界nlogba * logb(k+1)n,即T(n) = θ(nlogba * logb(k+1)n);

· Case3:若存在k1 > 0、k2 > 0,使得f(n) = Ω(nlogba +k1),且af(n/b) ≤ leq≤ (1 - k2)f(n),则则T(n)存在确界f(n),即T(n) = θ(f(n))。示例1:若T(n)满足递推式T(n) = 4*T(n/2) + n,求T(n)的确界,其中T(1) = θ(1)
解:很容易我们就能推算出该递推式符合上述的第一种情况,最后求出T(n) = θ(n2)。说明:从这里我们也可以看出在使用置换法时,我们大部分时候是得不到我们想要的最优解的。示例2:若T(n)满足递推式T(n) = 4*T(n/2) + n2,求T(n)的确界,其中T(1) = θ(1)
解:很容易我们就能推算出该递推式符合上述的第二种情况,最后求出T(n) = θ(n2logn)。示例3:若T(n)满足递推式T(n) = 4*T(n/2) + n3,求T(n)的确界,其中T(1) = θ(1)
解:很容易我们就能推算出该递推式符合上述的第三种情况,最后求出T(n) = θ(n3)。

递推式的计算:

1. 二阶常系数齐次递归方程求解步骤:

(1)写出特征方程

(2)得到特征根,r1和r2,

注意:

f(n)=c1r1^n+c2r2^n 当r1!=r2

F(n)=c1r^n+c2r^n 当r1=r2

(3)递归方程的通解:f(n)=c1r1^n+c2r2^n =....

(4)代入初始条件,求c1和c2

(5)得到递归方程的解f(n)=...

2. 二阶常系数非齐次递归方程求解步骤:

(1)写出对应齐次特征方程

(2)求特征根

(3)得到对应齐次递归方程的通解:f’(n)=

(4)由于g(n)= 属于n的m次多项式

(5)则令非齐次递归方程的特解为:f’’(n)=A0n^2+A1n+A2

(6)代入原递归方程得,

(7)化简

(8)非齐次递归方程的通解为:

(9)初始条件代入,求c1和c2

(10)所以,非齐次递归方程的通解为:

1. 什么是算法?

答:

算法是求解问题是的一系列计算步骤,能够将输入数据转换成输出结果。如果一个算法能够对其几乎每一个输入实例输出正确的结果并停止,那么这个算法就是正确的。一个正确的算法能解决给出的求解问题,一个不正确的算法对于某些输入来说可能根本不会停止,或者停止后得到的不是预期想要的结果。

2. 算法设计的目标?

(1)正确性:要求算法能够正确地执行预先设定的功能和性能的要求,这是最重要也是最基本的要求。

(2)可使用性:要求算法能够很方便地使用,这个特性也叫做用户友好性。

(3)可读性:算法应该易于人的理解,也就是可读性好。算法的逻辑应该是简单的、清晰的和结构化的。

(4)健壮性:算法应该具有一定的容错性,即提供异常处理,对那些不合理的数据进行检查,不经常出现异常中断和死机现象。

(5)高效率和低存储量:通常,算法的效率主要指算法的执行时间,如果一个问题能够被多个算法求解,执行时间短的算法效率高。算法的存储量指的是算法在执行的过程中所占用的最大存储空间。算法的效率和低存储量都与问题的规模有关。

3. 算法的特性?

(1)有限性:一个算法总是能够在执行有限步之后结束,每一步都可以在有限的时间内完成。

(2)确定性:算法的每一条指令都有明确的含义,不会产生二义性。

(3)可行性:算法的每一条运算都必须是足够基本的,原则上都能够被精确地执行,甚至人们仅用纸和笔通过有限次运算就能完成。

(4)输入性:一个算法有0个或多个输入。

(5)输出性:一个算法有1个或多个 输出。

4. 什么是递归?

答:

在数学和计算机科学中,递归是指函数在定义是调用自身的方法。如果在定义函数p是调用函数p,则成为直接递归。如果在定义函数p时调用函数q,在定义函数q是调用函数p,则成为间接递归。任何间接递归都能够转换成直接递归。

5. 递归算法设计的一般步骤?

(1)对原问题f(Sn)进行分析,抽象出合理的“小问题”f(Sn-1)。

(2)假设f(Sn-1)是可解的,在此基础上确定f(Sn)的解,即给出了f(Sn)与f(Sn-1)之间的关系。

(3)给出一个特定情况(如f(1)或f(0))的解,由此作为递归出口。

6. 分治法的主要思想?

答:

对于一个难以直接计算的问题,将它分解为一些规模较小的相同问题,以便琢个击破,分而治之。对于一个规模为n的问题,如果能够很容易的解决,那么直接求解。如果不能,那么将这个问题分解为k个规模较小的子问题,这些子问题相互独立且与原问题的形式相同,递归地求解这些子问题,然后通过这些子问题的解得到原问题的解。

7. 快速排序伪代码:

1. 将记录i和j分别指向待排序区域的最左端和最右端。

2. 重复下述过程,直到i=j

3. 右侧扫描,直到记录j的关键码小于基准的关键码;

4. 如果i<j,则将a[j]与a[i]交换,并且i++;

5. 左侧扫描,直到记录i的关键码小于基准的关键码;

6. 如果i<j,则将a[i]与a[j]交换,并且j--;

7. 退出循环,直到i和j指向基准的位置,并返回该位置。

8. 归并排序主要步骤:

1. 将当前序列a[low...high]一分为二,取mid=low+high/2,分解为两个子序列a[low...mid]和a[mid+1...high]

2. 递归地将两个序列a[low...mid]和a[mid+1...high]进行二路归并排序,其终结条件是直到子序列的长度为1或0

3. 与分解过程相反,将排好序的两个子序列a[low...mid]和a[mid+1...high]合并成一个有序序列a[low...high]

9. 折半查找伪代码:

1. low=1,high=n;//设置初始查找区间

2. 测试查找区间a[low...high]是否存在,若不存在,则查找失败,否则

3. 取中间值mid=low+high/2,将a[mid]与k进行比较,有三种情况

4. 若k<a[mid],则high=mid-1,查找在左半区进行,转步骤2

5. 若k>a[mid],则low=mid+1,查找在右半区进行,转步骤2

6. 若k=a[mid],则查找成功,并返回a[mid]的位置

10. 蛮力法求解0/1背包问题伪代码

输入:背包的最大容量,物品的个数n,n个物品的重量w[n]和物品的价值v[n]

输出:装入背包的物品编号及其产生的最大价值

1. 初始化背包的最大价值max=0,结果子集s=空集

2. 对集合{1,2,....n}的每一个子集t,执行如下操作

3. 初始化当前背包的重量w=0,背包的价值v=0

4. 对子集t中的每一个元素j

5. 如果w+wj<c,则w=w+wj,v=v+vj

6. 否则,转到步骤2考察下一个子集

7. 如果max<v,则max=v,s=t

8. 输出子集s中的元素

11. 蛮力法解决任务分配问题伪代码

输入:成本矩阵c[n][n]

输出:最小总成本

1. 初始化最小总成本mincost=MAX

2. 对集合{1,2,3....n}的全排列p1p2p3..pn,执行如下操作

3. 初始化当前方案的成本cost=0

4. 对排列中的每一个元素pi,执行cost=cost+c[i][pi]

5. 如果cost<mincost,则mincost=cost

6. 输出mincost

12. 什么是回溯法?

答:回溯法是在包含所有解的解空间树中,采用深度优先搜索策略,从根节点出发搜索该解空间树。

13. 回溯法的主要思想:从一条路出发,能进则进,不能进就退回来,换一条路在试

14. 回溯法的特点

答:它是按跳跃式的深度优先搜索方式搜索解空间树,即判定函数先判定x[k]的取值,如果x[k]的取值是合理的,则搜索以x[k]为根节点的子树,如果x[k]取完了所有的取值,则回溯到x[k-1]。

15. 回溯法求解0/1背包问题伪代码:

Begin

1. 设Backtrack(i)表示对第i层结点的搜索

2. If(i>n),输出一个解,结束算法;

3. If 当前背包的重量w+wi<c,进入左子树

3.2 w=w+wi,v=v+vi;

3.3 搜索下一层节点,即backtrack(i+1);

3.4 回退,w=w-wi,v=vi;

4. if bound(i+1)>最优价值,进入右子树,即backtrack(i+1);

End

16. 回溯法求解N皇后问题伪代码:

1. 初始化解向量x[k]={-1}

2. K=1

3. While(k>=1)

3.1 将皇后摆放到下一列即x[k]++;

3.2 将皇后k摆放在位置x[k]处,如果不发生冲突,则转步骤3.3,否则x[k]--,考察下一列

3.3 如果n个皇后全部摆放,则输出一个解,结束算法;

3.4 如果仍有皇后未摆放,则转步骤3,摆放下一个皇后

3.5 如果x[k]出界,则回溯,x[k]-1,k-,转步骤3

4. 退出循环,则n皇后问题无解

17. 分支限界法求解0/1背包问题

1. 根据限界函数计算目标函数的上界up,采用贪心算法求其下界down

2. 计算根结点的目标函数值并加入到待处理的结点表PT中

3. 循环直到某个叶子结点的目标函数值取极大值

4. i=pt 表中具有最大值的结点

5. 对结点i的每一个孩子x结点进行如下操作:

6. 如果结点x不满足约束条件,则丢弃该结点;

7. 如果结点x满足约束条件,则计算它的目标函数值,并加入到PT表中,

4.将叶子结点对应的最优值输出,回溯求得最优解的各个分量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值