- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
试验一 分治与递归算法的应用
一、试验目的
把握分治算法的根本思想〔分-治-合〕、技巧和效率分析方法。
娴熟把握用递归设计分治算法的根本步骤〔基准与递归方程〕。
学会利用分治算法解决实际问题。二 . 试验容
金块问题
老板有一袋金块〔共 n 块,n 是 2 的幂〔n≥2〕 ,最优秀的雇员得到其中最重的一块,最差的雇员得到其中最轻的一块。假设有一台比较重量的仪器,期望用最少的比较次数找出最重和最轻的金块。并对自己的程序进展简单性分析。
三. 问题分析:
一般思路:假设袋中有n 个金块。可以用函数M a x〔程序1 - 3 1〕通过n-1 次比 较找到最 重的金块。找到最重的金块后, 可以从余下的n-1 个金块中用类似法通过n-2 次比较找出最轻的金块。这样,比较的总次数为 2n-3。
分治法:当 n 很小时,比方说, n≤2,识别出最重和最轻的金块, 一次比较就足够了。当 n 较大时〔n>2〕,第一步,把这袋金块平分成两个小袋A 和B。其次步,分别找出在A 和B 中最重和最轻的金块。设 A 中最重和最轻的金块分别为 HA 与 LA,以此类推,B 中最重和最轻的金块分别为HB 和LB。第三步,通过比较HA 和 HB,可以找到全部金块中最重的;通过比较 LA 和 LB,
可以找到全部金块中最轻的。在其次步中,假设n>2,那么递归地应 用分而治之方法
程序设计
据上述步骤,可以得出程序 1 4 - 1 的非递归代码。该程序用于查找到数组w [ 0 : n - 1 ]中的最小数和最大数,假设n 1,那么程序返回f a l s e,否那么返回t r u e。
当n≥1 时,程序 1 4 - 1 给M i n 和M a x 置初值以使w [ M i n ]是最小的重量,w [ M a x ]为最大的重量。
首先处理n≤1 的状况。假设n1 且为奇数,第一个重量w [ 0 ] 将成为最小值和最大值的候选值,因此将有偶,数个重量值 w [ 1 : n - 1 ] 参与f o r 循环。当n 是偶数时,首先将两个重量值放在for 循环外进展比较,较小和较大的重量值分别置为 Min 和Max,因此也有偶数个重量值w[2:n-1]参与for 循环。
在for 循环中,外层 if 通过比较确定( w [ i ] , w [ i + 1 ] )中的较大和较小者。此工作与前面提到的分而治之算法步骤中的 2) 相对应,而层的 i f 负责找出较小重量值和较大重量值中的最小值和最大值,这个工作对应于 3 )。for 循环将每一对重量值中较小值和较大值分别与当前的最小值w [ M i n ]和最大值w [ M a x ]进展比较,依据比较结果来修改M i n 和M a x〔假如必要〕。
源程序
*includeiostream
*includestring.h
*includealgorithm using namespace std; 0
float max(float g1,float g2)//比较找大值
{
return(g1g2?g1:g2);
}
float min(float g1,float g2)//比较找小值
{
return(g1g2?g1:g2);
}
float Search_Max(float g[],int left,int right)//用二分法递归找最大值
{
if(left==right)
{
//当只有一个数时,直接返回该值
float max; max=g[right]; return max;
}
if(right-left==1)
{
float LM,RM;
LM=g[left];
RM=g[right]; return(max(LM,RM));
}
if(right-left1)
{
float LM,RM;
int mid=(left+right)/2;//取中点LM=Search_Max(g,left,mid);
RM=Search_Max(g,mid,right);//左半局部,右半局部的最大值比较找最大
return(max(LM,RM));
}
}
float Search_Min(float g[],int left,int right)//用二分法递归找最小值
{
if(left==right)
{
float min; min=g[right]; return min;
}
if(right-left==1)
{
float LM,RM;
LM=g[left];
RM=g[right]; return(min(LM,RM));
}
if(right-left1)
{
float LM,RM;
int mid=(left+right)/2; LM=Search_Min(g,left,mid);
原创力文档


文档评论(0)