分治与递归上机.doc

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
分治与递归上机

实验1分治与递归上机 [实验目的] 1.掌握分治算法的基本思想(分-治-合)、技巧和效率分析方法; 2.熟练掌握利用递归设计分治算法的基本步骤; 3.学会利用分治算法解决实际问题。 [实验要求] 按以下实验内容完成题目,并把编译、运行过程中出现的问题以及解决方法填入实验报告中,按时上交。 [实验学时] 2学时。 [实验内容] 一、实验内容 金块问题。老板有一袋金块(共n块,n是2的幂(n≥2)),最优秀的雇员得到其中最重的一块,最差的雇员得到其中最轻的一块。假设有一台比较重量的仪器,希望用最少的比较次数找出最重和最轻的金块。请对自己实现的程序进行复杂性分析。 二、算法描述 (1)划分:将数组分割成两半 (2)治理:在每一半中找到最大值和最小值。 (3)合并:返回两个最大值中的最大值和两个最小值中的最小值。 Minmax(int low,int high) { if low==high return(A[low],A[high]) //只有一个元素 else if high-low=1 then //如果只有两个元素直接解决 if A[low]A[high] then return(A[low],A[high]) else return(A[high],A[low]) end if else //否则递归解决 mid=(low+high)/2 ; //将区间一分为二 (x1,y1)=minmax(low,mid); //求左半区间的最大最小值 (x2,y2)=minmax(mid+1,high); //右半区间的最大最小值 x=min{x1,x2}; y=max(y1,y2); //求整体最大最小值 return(x,y); endif } 三、源程序 #includestdio.h #define Maxsize 1000 void Minmax(int A[],int low,int high,int *min,int *max); void main() { int n; int min,max; int Gold[Maxsize]; printf(please input n: ); scanf(%d,n); printf(please input weight of gold: ); for(int i=1;i=n;i++) { scanf(%d,Gold[i]); } Minmax(Gold,1,n,min,max); printf(\nMin: %d,min); printf(\nMax: %d\n,max); } void Minmax(int A[],int low,int high,int *min,int *max) { int mid,x1,x2,y1,y2; if (low==high) { *min=*max=A[low]; } if (high-low==1) { if (A[low]A[high]) { *min=A[low]; *max=A[high]; } else { *min=A[high]; *max=A[low]; } } if (low!=high((high-low)!=1)) { mid=(low+high)/2; Minmax(A,low,mid,x1,y1); Minmax(A,mid+1,high,x2,y2); if (x1x2) *min=x2; else *min=x1; if (y1y2) *max=y1; else *max=y2; } } 四、程序的复杂度分析 T(n)=1 (n=2) T(n)=2T(n/2)+2 (n=2) 得 T(n)=n/2+n-2 O(n)=n 《算法设计与分析》实验报告

文档评论(0)

cgtk187 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档