算法设计与分析实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
本科实验报告
课程名称:算法设计与分析
实验项目:递归与分治算法
实验地点:计算机系实验楼110
专业班级:物联网1601 学号:2016002105 学生:俞梦真
指导教师:郝晓丽
2018年05月04 日
实验一递归与分治算法
1.1 实验目的与要求
1.进一步熟悉C/C++语言的集成开发环境;
2.通过本实验加深对递归与分治策略的理解和运用。
1.2 实验课时
2学时
1.3 实验原理
分治(Divide-and-Conquer)的思想:一个规模为n的复杂问题的求解,可以划分成若干个规模小于n的子问题,再将子问题的解合并成原问题的解。
需要注意的是,分治法使用递归的思想。划分后的每一个子问题与原问题的性质相同,可用相同的求解方法。最后,当子问题规模足够小时,可以直接求解,然后逆求原问题的解。
1.4 实验题目
1.上机题目:格雷码构造问题
Gray码是一个长度为2n的序列。序列无相同元素,每个元素都是长度为n的串,相邻元素恰好只有一位不同。试设计一个算法对任意n构造相应的Gray码(分治、减治、变治皆可)。
对于给定的正整数n,格雷码为满足如下条件的一个编码序列。
(1)序列由2n个编码组成,每个编码都是长度为n的二进制位串。
(2)序列中无相同的编码。
(3)序列中位置相邻的两个编码恰有一位不同。
2.设计思想:
根据格雷码的性质,找到他的规律,可发现,1位是0 1。两位是00 01 11 10。三位是000 001 011
010 110 111 101 100。n位是前n-1位的2倍个。N-1个位前面加0,N-2为倒转再前面再加1。
3.代码设计:
}
}
}
int main()
{
int n;
while(cin>>n)
{
get_grad(n);
for(int i=0;i cout< My_grad.clear(); } return 0; } 运行结果: 1.5 思考题 (1)递归的关键问题在哪里? 答: 1.递归式,就是如何将原问题划分成子问题。 2.递归出口,递归终止的条件,即最小子问题的求解,可以允许多个出口。 3.界函数,问题规模变化的函数,它保证递归的规模向出口条件靠拢(2)递归与非递归之间如何实现程序的转换? (3)分析二分查找和快速排序中使用的分治思想。 答: 1.一般根据是否需要回朔可以把递归分成简单递归和复杂递归,简单递归一般就是根据递归式来找出递推公式(这也就引申出分治思想和动态规划)。 2.复杂递归一般就是模拟系统处理递归的机制,使用栈或队列等数据结构保存回朔点来求解。 (4)分析二次取中法和锦标赛算法中的分治思想。 二次取中法:使用快速排序法中所采用的分划方法,以主元为基准,将一个表划分为左右两个子表,左子表中的元素均小于主元,右子表中的元素均大于主元。主元的选择是将表划分为r 部分,对找出r个中的中间值,并求r组的中间值中的中间值。 锦标赛算法: 两两分组比较,大者进入下一轮,知道剩下1个元素max为止。在每次比较中淘汰较小元素,将被淘汰元素记录在淘汰它的元素的链表上。检查max的链表,从中知道最大元素,即second 本科实验报告 课程名称:算法设计与分析 实验项目:贪心算法 实验地点:计算机系实验楼110 专业班级:物联网1601 学号:2016002105 学生:俞梦真 指导教师:郝晓丽 2018年05月04日 实验二贪心算法 2.1 实验目的与要求 1.理解贪心算法的基本思想; 2.运用贪心算法解决实际问题,加深对贪心算法的理解和运用。 2.2 实验课时 4学时(课2学时+课外2学时) 2.3 实验原理 贪心算法的思想: (1)贪心算法(Greedy Approach)能得到问题的最优解,要证明我们所做的第一步选择一定包含着一个最优解,即存在一个最优解的第一步是从我们的贪心选择开始。 (2)在做出第一步贪心选择后,剩下的子问题应该是和原问题类似的规模较小的子问题,为此我们可以用数学归纳法来证明贪心选择能得到问题的最优解。 2.4 实验题目 1.上机题目:最小延迟调度问题 给定等待服务的客户集合A={1,2,…,n},预计对客户i的服务时长为t i>0,T=(t1,t2,…,t n),客户i希望的服务完成时刻为d i>0,D=(d1,d2,…,d n);一个调度f:A→N,f(i)为客户i的开始时刻。如果对客户i的服务在d i之前结束,那么对客户i的服务没有延迟,即如果在d i之后结束,那么这个服务就被延迟了,延迟的时间等于该服务的实际完成时刻f(i)+t i减去预期结束时刻d i。一个调度f的最大延迟是所有客户延迟时长的最大值max i∈A{f(i)+t i d i}。附图2所示是不同调度下的最大延迟。使用贪心策略找出一个调度使得最大延迟达到最小。 2.设计思想: 贪心思想,按照他们的截止时间从小到大排序,如果截止时间相同按照花费时间从小到大排序。然后按照f_min(所有客户延迟时长的最大值)=max(works[i].cost+time-works[i].deadline,f_min);寻找最所有客户延迟时长的最大值。3.代码设计: