- 1、本文档共7页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
实验一 分治递归算法的应用
实验一 分治与递归算法的应用
一、实验目的
1.掌握分治算法的基本思想(分-治-合)、技巧和效率分析方法。
2.熟练掌握用递归设计分治算法的基本步骤(基准与递归方程)。
3.学会利用分治算法解决实际问题。
二、问题描述
金块问题
老板有一袋金块(共n块,n是2的幂(n≥2)),最优秀的雇员得到其中最重的一块,最差的雇员得到其中最轻的一块。假设有一台比较重量的仪器,希望用最少的比较次数找出最重和最轻的金块。并对自己的程序进行复杂性分析。
3、问题分析
一般思路:假设袋中有n 个金块。可以用函数M a x,通过n-1次比较找到最重的金块。找到最重的金块后,可以从余下的n-1个金块中用类似法通过n-2次比较找出最轻的金块。这样,比较的总次数为2n-3。
分治法:
如果集合中只有1个元素,则它既是最大值也是最小值;
如果有2个元素,则一次maxnum(i,j) 一次minnum(i,j)就可以得到最大值和最小值;
如果把集合分成两个子集合,递归的应用这个算法分别求出两个子集合的最大值和最小值,最后让子集合1的最大值跟子集合2的最大值比较得到整个集合的最大值;让子集合1的最小值跟子集合2的最小值比较得到整个集合的最小值。
程序设计
对金块问题的程序设计如下:
核心算法分析
double Search_Max(double g[],int left,int right)与double Search_Min(double g[],int left,int right)函数分别是求最大重量与最小重量金块的被调用函数,函数体中
当left==right时,只有一个重量,最小和最大重量相等,分别直接返回返回g[left],g[right]。
当right-left==1时,有两个重量,分别调用一次min(g1,g2)和max(g1,g2)函数就可得出最小与最大重量,分别返回。
当right-left1时,mid=(left+right)/2取中点,将数据群分为两半,分别递归调用,最后将得到的两个数据群的最值运用min()或max()函数得到最小最大重量。
函数调用及主函数设计
Int main()中,首先输入要输入的数据个数n,运用for循环将数据输入到gold[0~n]数组中,然后分别调用Search_Max(gold,0,n-1)和Search_Min(gold,0,n-1)函数输出最小最大重量;
double Search_Max(double g[],int left,int right)与double Search_Min(double g[],int left,int right)函数中,分别调用min(g1,g2)和max(g1,g2)函数实现查找最小最大值功能。
主要算法流程图
四.程序调试及运行结果分析
五.实验总结
这次实验我又更深层次的了解了分治算法,知道了分治法的思想是,将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。对它的运用模型更加熟悉,相信以后会更加熟练的运用它。
附录源程序:
#includeiostream
#includestring.h
#includealgorithm
using namespace std;
double max(double g1,double g2)//比较找大值
{
return(g1g2?g1:g2);
}
double min(double g1,double g2)//比较找小值
{
return(g1g2?g1:g2);
}
double Search_Max(double g[],int left,int right)//用二分法递归找最大值
{
if(left==right) //当只有一个数时,直接返回该值
{
double max;
max=g[right];
return max;
}
if(right-left==1)
{
double LM,RM;
LM=g[left];
RM=g[right];
return(max(LM,RM));
}
if(right-left1)
{
double LM,RM;
int mid=(left+right)/2;//取中点
LM=Search_Max(g,left,mid);
RM=Search_Max(g,mid,right);//左半部分,右半部分的最大值比较找最大
return(max(LM,RM));
}
}
double Search_Min(double g[],int left,int right)//用二分法
您可能关注的文档
- 宏观微观经济学汇总.doc
- 宏观经济 第章生活费用的衡量(题目+答案+详解).doc
- 宏观经济 习题8-29-30.doc
- 宏观经济 习题apter 28.doc
- 宏观经济因素对的影响分析.doc
- 宏观经济存在的及对策.doc
- 宏观经济学 课点题目答案.doc
- 宏观经济学(Mroeconomics).doc
- 宏观经济学作业作).doc
- 宏观经济学期末及答案.doc
- 新高考生物二轮复习讲练测第6讲 遗传的分子基础(检测) (原卷版).docx
- 新高考生物二轮复习讲练测第12讲 生物与环境(检测)(原卷版).docx
- 新高考生物二轮复习讲练测第3讲 酶和ATP(检测)(原卷版).docx
- 新高考生物二轮复习讲练测第9讲 神经调节与体液调节(检测)(原卷版).docx
- 新高考生物二轮复习讲练测第11讲 植物生命活动的调节(讲练)(原卷版).docx
- 新高考生物二轮复习讲练测第8讲 生物的变异、育种与进化(检测)(原卷版).docx
- 新高考生物二轮复习讲练测第5讲 细胞的分裂、分化、衰老和死亡(讲练)(原卷版).docx
- 新高考生物二轮复习讲练测第5讲 细胞的分裂、分化、衰老和死亡(检测)(原卷版).docx
- 新高考生物二轮复习讲练测第12讲 生物与环境(讲练)(原卷版).docx
- 新高考生物二轮复习讲练测第11讲 植物生命活动的调节(检测)(原卷版).docx
文档评论(0)