- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
分治与递归算法的应用
实验一 分治与递归算法的应用 一、实验目的 1.掌握分治算法的基本思想(分-治-合)、技巧和效率分析方法。 2.熟练掌握用递归设计分治算法的基本步骤(基准与递归方程)。 3.学会利用分治算法解决实际问题。 二、问题描述 题目四:金块问题 老板有一袋金块(共n块,n是2的幂(n≥2)),最优秀的雇员得到其中最重的一块,最差的雇员得到其中最轻的一块。假设有一台比较重量的仪器,希望用最少的比较次数找出最重和最轻的金块。并对自己的程序进行复杂性分析。 三、算法设计 (一)、数据结构与核心算法的设计描述 数据结构: #define Max 100 //设置存放金块的数组的最大上限 void maxmin(int i,int j,float a[],float max,float min);//递归求最大最小元素 核心算法描述: 本算法为分治算法中的二分法,可以用较少的比较次数解决金块问题。算法描述如下: 1)将数据等分为两组(两组数据可能差1),目的是分别选取其中的最大和最小值 2)递归分解直到每组元素发的个数=2,可简单的找到最大(小)值。 3)回溯时合并子问题的解,在两个子问题的解中大者取大,小者取小,即合并为金块问题的解 (二)、函数调用及主函数设计 void main() { int n; float max,min; float a[Max]; cout请输入金块的个数:; cinn; cout它们的标号分别为0~n-1endl; cout请输入对应金块的重量:; for(int i=0;in;i++) cina[i]; maxmin(0,n-1,a,max,min); cout最轻的金块重量为:minendl; } (三)、主要算法流程图及程序清单 分治算法流程图: i=j i=j-1 else 是 否 程序清单: #includeiostream.h #define Max 100 void maxmin(int i,int j,float a[],float max,float min); void main() { int n; float max,min; float a[Max]; cout请输入金块的个数:; cinn; cout请输入对应金块的重量:; for(int i=0;in;i++) cina[i]; maxmin(0,n-1,a,max,min); cout最重的金块重量为:maxendl; cout最轻的金块重量为:minendl; } void maxmin(int i,int j,float a[],float max,float min) { if(i==j) { max=a[i]; min=a[i]; } else if(i==j-1) { if(a[i]a[j]) { max=a[i]; min=a[j]; } else { max=a[j]; min=a[i]; } } else { int mid; float lmax,lmin,rmax,rmin; mid=(i+j)/2; maxmin(i,mid,a,lmax,lmin); maxmin(mid+1,j,a,rmax,rmin); if(lmaxrmax) max=lmax; else max=rmax; if(lminrmin) min=lmin; else min=rmin; } } 四.程序调试及运行结果分析 程序调试:刚开始的时候把赋值符号“=”和比较符号“= =”弄混了,所以第一次运行时老出错,不过改正过来以后,就运行通过了。 运行结果: 五.实验总结 通过这次实验,我对算法的意义又多了一些认识,一个好的算法真的很重要,特别是当数据量很大的时候。就比如本题中的金块问题,如果用蛮力法,对金块逐个进行比较,平均比较次数是3(n-1)/2.但是如果用分治法的话,平均比较次数为1.5n-2,比前者要好一点,最重要的是递归算法的空间效率和运行效率都是比较低的。这也提醒我们,实际应用中不能仅仅根据时间复杂性选择算法。 a[i]a[j]? max=a[i] min=a[i]; 判断i和j的关系 开始 max=a[i] min=a[j]; max=a[j] min=a[i]; mid=(i+j)/2; 左半边递归调用,得到lmax,lmin;右半边递归调用,得到rmax,rmin lmaxrmax? lminrmin? max=lmax min=lmin max=rmax min=rmin
文档评论(0)