为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

分治法求最大值和最小值

2018-02-05 4页 doc 27KB 35阅读

用户头像

is_668482

暂无简介

举报
分治法求最大值和最小值分治法求最大值和最小值 实 验 报 告 一、实验名称:分治法求最大值和最小值 二、实验学时:4 三、实验器材和环境:PC机一台 四、实验内容和目的: 1、实验目的:加深对分治算法原理及实现过程的理解。 2、实验任务:实现用分治算法解决问题。 3、实验内容: 给定一个顺序表,编写一个求出其最大值和最小值的分治算法。 分析: 由于顺序表的结构没有给出,作为演示分治法这里从简顺序表取一整形数组数组大小由用户定义,数据随机生成。我们知道如果数组大小为 1 则可以直接给出结果,如果大小为 2则一次比较即可得出结果,于是...
分治法求最大值和最小值
分治法求最大值和最小值 实 验 报 告 一、实验名称:分治法求最大值和最小值 二、实验学时:4 三、实验器材和环境:PC机一台 四、实验内容和目的: 1、实验目的:加深对分治算法原理及实现过程的理解。 2、实验任务:实现用分治算法解决问题。 3、实验内容: 给定一个顺序表,编写一个求出其最大值和最小值的分治算法。 分析: 由于顺序表的结构没有给出,作为演示分治法这里从简顺序表取一整形数组数组大小由用户定义,数据随机生成。我们知道如果数组大小为 1 则可以直接给出结果,如果大小为 2则一次比较即可得出结果,于是我们找到求解该问题的子问题即: 数组大小 <= 2。到此我们就可以进行分治运算了,只要求解的问题数组长度比 2 大就继续分治,否则求解子问题的解并更新全局解以下是代码。 五、实验原理: 分治算法基本原理,将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。 大概分为“分治合“策略: 分:将要求解的较大规模的问题分割成K个更小规模的子问题; 治:对这K个子问题分别求解。如果子问题的规模仍然不够小则再划分为K个子问题,如此递归的进行下去;划分到基础问题,则设计可行算法直接求解; 合:将求出的小规模的问题的解合并为一个更大规模的问题的解,自底向上逐步求出原来问题的解。 一个分治法将规模为n的问题分成k个规模为n,m的子问题去解。设分解阀值n=1,且adhoc解规模为1的问题耗费1个单位时间。再设将原问题分解为k个0 子问题以及用merge将k个子问题的解合并为原问题的解需用f(n)个单位时间。用T(n)表示该分治法解规模为|P|=n的问题所需的计算时间,则有: On,(1),1Tn (),,kT(n/m),f(n)n,1, logn,1mlogkjjm通过迭代法求得方程的解: T(n),n,kf(n/m),,0j六、实验步骤: 1、设定参数: s为当前分治段的开始下标,e为当前分治段的结束下标,meter表 的地址,max为存储当前搜索到的最大值,min为存储当前搜索到的最小值 2、获取局部解,并更新全局解,不是子问题的话就继续分治 3、用一组随机数据填充数组并以表的形式输出 4、用分治法获取最大值和最小值 七、实验数据及结果分析: 分治算法代码: #include #include #include #include #define M 40 // 分治法获取最优解 void PartionGet(int s,int e,int *meter,int *max,int *min) { int i; if(e-s <= 1) { // 获取局部解,并更新全局解 if(meter[s] > meter[e]) { if(meter[s] > *max) *max = meter[s]; if(meter[e] < *min) *min = meter[e]; } else{ if(meter[e] > *max) *max = meter[s]; if(meter[s] < *min) *min = meter[s]; } return ; } i = s + (e-s)/2; // 不是子问题继续分治 PartionGet(s,i,meter,max,min); PartionGet(i+1,e,meter,max,min); } int main() { int i,meter[M]; int max = INT_MIN; // 用最小值初始化 int min = INT_MAX; // 用最大值初始化 printf("The array's element as followed:\n\n"); srand(time(0)); // 初始化随机数发生器 for(i = 0; i < M; i ++) { // 随机数据填充数组 meter[i] = rand()%10000; if(!((i+1)%10)) // 输出表的随机数据 printf("%-6d\n",meter[i]); else printf("%-6d",meter[i]); } PartionGet(0,M - 1,meter,&max,&min); // 分治法获取最值 printf("\nMax : %d\nMin : %d\n",max,min); system("pause"); return 0; } 实验结果:
/
本文档为【分治法求最大值和最小值】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索