欢迎来到冰豆网! | 帮助中心 分享价值,成长自我!
冰豆网
全部分类
  • IT计算机>
  • 经管营销>
  • 医药卫生>
  • 自然科学>
  • 农林牧渔>
  • 人文社科>
  • 工程科技>
  • PPT模板>
  • 求职职场>
  • 解决方案>
  • 总结汇报>
  • 党团工作>
  • ImageVerifierCode 换一换
    首页 冰豆网 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

    计算机算法实验1 分治与递归 报告.docx

    • 资源ID:10485929       资源大小:114.65KB        全文页数:21页
    • 资源格式: DOCX        下载积分:15金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录
    二维码
    微信扫一扫登录
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    计算机算法实验1 分治与递归 报告.docx

    1、计算机算法实验1 分治与递归 报告算法设计与分析姓名: 班级:学号:课题:分治与递归指导教师: 2013/12/24目录1实验目的与要求 12实验内容 12.1基本题一:基本递归算法 12.1.1问题概述 12.1.2实验截图 12.2基本题二:棋盘覆盖问题 32.2.1问题概述 32.2.2实验截图 42.3提高题一:二分搜索 52.3.1问题概述 52.3.2实验截图 52.4提高题二:用分治法实现元素选择 72.4.1问题概述 72.4.2实验截图 83实验心得 9说明:代码在最后1实验目的与要求1)熟悉C/C+语言的集成开发环境2)通过本实验加深对递归过程的理解3)掌握递归算法的概念和

    2、基本思想,分析并掌握“整数划分”问题的递归算法4)掌握棋盘覆盖问题的算法5)初步掌握分治算法6)熟悉二分搜索算法7)使用分治法编程,求解线形序列中第k小元素。2实验内容2.1基本题一:基本递归算法2.1.1问题概述任意输入一个整数,输出结果能够用递归方法实现整数的划分2.1.2实验截图输入1,1,则结果为1:输入10,1,结果为1:输入1,8,结果为1:输入6,6,结果为11:2.2基本题二:棋盘覆盖问题2.2.1问题概述 在一个2k2k 个方格组成的棋盘中,恰有一个方格与其它方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。在棋盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖给定的特

    3、殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。2.2.2实验截图 比如输入8,代表88的棋盘,输出的数代表L型骨牌的编号。本题编号从零开始,所以输入1,1代表第二行第二列为特殊方格,结果如下: 换一个数据,比如44,结果如下:2.3提高题一:二分搜索2.3.1问题概述1、设a0:n-1是一个已排好序的数组。请改写二分搜索算法,使得当搜索元素x不在数组中时,返回小于x的最大元素的位置I和大于x的最大元素位置j。当搜索元素在数组中时,I和j相同,均为x在数组中的位置。2、设有n个不同的整数排好序后存放于t0:n-1中,若存在一个下标I,0in,使得ti=i,设计一个有效的算法找

    4、到这个下标。要求算法在最坏的情况下的计算时间为O(logn)。2.3.2实验截图1、改写的二分搜索算法,下标从零开始:(1)查找存在的数据,如5,其下标为4:(2)查找不存在的数据,如11,则其前一个数据下标为7,后一个下标为8:2、查找下标:(1)下标7对应的值为7,输出:(2)如果没有符合的数据,输出如下:2.4提高题二:用分治法实现元素选择2.4.1问题概述给定线形序列集中n个元素和一个整数k,1kn,输出这n个元素中第k小元素的值及其位置。简述该算法的原理、步骤。对该算法与直接排序查找进行比较,测试要求:元素个数不少于100;分三种情况:k=1、k=n和k=中位数。2.4.2实验截图共

    5、有100个数据,查找第1小的元素:查找第50小的元素:查找第100小的元素:3实验心得这次实验主要是分治与递归思想的运用。通过这些题目,我比较深入地理解了递归与分治算法的要点。当然现在使用还不熟练,许多题目还要参考书本和网上的资料才能编写代码。以后还要好好学习算法知识,毕竟学习软件离不开算法,只有把算法学习好了,才能写出优秀的代码,因为算法是软件的灵魂嘛。算法确实很难,由其在起步阶段更是如此。但是学习是个长期的过程,一定不能轻言放弃。见习的阶段本来就会在挫败中成长,我会坚持下去,争取在算法界占据一席之地。1基本题一:基本递归算法#includeusing namespace std;int m

    6、ain() int n,m; cout input n,m: nm; int f(int, int); cout划分个数为:f(n, m); return 0;int f(int q, int p) if (q = 1 | p = 1) return 1; else if (q p) return f(q, q); else if (q = p) return 1 + f(q, p - 1); return f(q, p - 1) + f(q - p, p);2基本题二:棋盘覆盖问题#includeusing namespace std;int tile = 1; /L型骨牌的编号(递增)in

    7、t board100100; /棋盘/* tr-当前棋盘左上角的行号* tc-当前棋盘左上角的列号* dr-当前特殊方格所在的行号* dc-当前特殊方格所在的列号* size:当前棋盘的:2k*/void main() int size; void chessBoard(int,int,int,int,int); cout size; int index_x, index_y; cout index_x index_y; chessBoard(0, 0, index_x, index_y, size); for (int i = 0; isize; i+) for (int j = 0; j

    8、size; j+) cout boardijt; cout endl; void chessBoard(int tr, int tc, int dr, int dc, int size) if (size = 1) /棋盘方格大小为1,说明递归到最里层 return; int t = tile+; /每次递增1 int s = size / 2; /棋盘中间的行、列号(相等的) /检查特殊方块是否在左上角子棋盘中 if (drtr + s & dctc + s) /在 chessBoard(tr, tc, dr, dc, s); else /不在,将该子棋盘右下角的方块视为特殊方块 board

    9、tr + s - 1tc + s - 1 = t; chessBoard(tr, tc, tr + s - 1, tc + s - 1, s); /检查特殊方块是否在右上角子棋盘中 if (dr= tc + s) /在 chessBoard(tr, tc + s, dr, dc, s); else /不在,将该子棋盘左下角的方块视为特殊方块 boardtr + s - 1tc + s = t; chessBoard(tr, tc + s, tr + s - 1, tc + s, s); /检查特殊方块是否在左下角子棋盘中 if (dr = tr + s & dc= tr + s & dc =

    10、tc + s) /在 chessBoard(tr + s, tc + s, dr, dc, s); else /不在,将该子棋盘左上角的方块视为特殊方块 boardtr + stc + s = t; chessBoard(tr + s, tc + s, tr + s, tc + s, s); 3提高题一:二分搜索(1) 改写#includeusing namespace std;int binarySearch(int a, int n, int x, int &i, int &j)/a 为要搜索的数组; n为数组元素的个数; x为要查询的元素值;i为小于x的最大元素位置;j为大于x的最小元素

    11、的位置 int middle; /中值 int right = n - 1; / 数组的右边界 int left = 0; /数组的左边界 while (left amiddle) left = middle + 1; else right = middle - 1; i = right; j = left; return -1; /查询失败int main() int i; int j; int m;/要查找的数据 int middle; int b = 1, 2, 3, 4, 5, 6, 7, 8, 12, 22 ; /用来测试的数组 cout 预设数组为: endl; for (i =

    12、0; i 10; i+) cout bi ; cout 请输入要查找的数据: m; middle = binarySearch(b, 10, m, i, j);/调用二分搜索算法 if (middle != -1) /查询成功 printf(下标为 : %d,i 是 %d, j 是 %d n, middle, i, j); else /查询失败 printf(该数据不存在,i是 : %d,j 是: %d n, i, j); return 0;(2) 找下标#include using namespace std;int search(int a, int n) int left = 0; in

    13、t right = n - 1; while (left= right) int mid = (left + right) / 2; if (amid = mid) return mid; if (amid mid) left = mid + 1; else right = mid - 1; return -1;int main() int a = -4, -2, 1, 2, 3, 4, 5, 7, 9 ; /可以将7改为8,则查找不出符合要求的值 int m;/要查询的数据 int n; cout 预设数组为: endl; for (int i = 0; i 9; i+) cout ai ;

    14、 n = search(a, 9); if (n!=-1) cout 结果为:nendl; else cout 数据不存在! endl; return 0;4提高题二:用分治法实现元素选择#include #include using namespace std;template void Swap(Type &x, Type &y);inline int Random(int x, int y);template void BubbleSort(Type a, int p, int r);template int Partition(Type a, int p, int r, Type x)

    15、;template Type Select(Type a, int p, int r, int k);int main() /初始化数组 int a100; int f; /必须放在循环体外面 srand(unsigned) time(0); cout 产生的随机数组为: endl; for (int i = 0; i100; i+) ai = Random(0, 500); cout ai ; cout endl; cout 请输入要查第几小的元素: f; cout 第f小元素是: Select(a, 0, 99, f) endl;template void Swap(Type &x, Ty

    16、pe &y) Type temp = x; x = y; y = temp;inline int Random(int x, int y) int ran_num = rand() % (y - x) + x; return ran_num;/冒泡排序template void BubbleSort(Type a, int p, int r) /记录一次遍历中是否有元素的交换 bool exchange; for (int i = p; i = r - 1; i+) exchange = false; for (int j = i + 1; j = r; j+) if (ajaj - 1) S

    17、wap(aj, aj - 1); exchange = true; /如果这次遍历没有元素的交换,那么排序结束 if (false = exchange) break; template int Partition(Type a, int p, int r, Type x) int i = p - 1, j = r + 1; while (true) while (a+ix & ix); if (i = j) break; Swap(ai, aj); return j;template Type Select(Type a, int p, int r, int k) if (r - p75)

    18、BubbleSort(a, p, r); return ap + k - 1; /(r-p-4)/5相当于n-5 for (int i = 0; i = (r - p - 4) / 5; i+) /将元素每5个分成一组,分别排序,并将该组中位数与ap+i交换位置 /使所有中位数都排列在数组最左侧,以便进一步查找中位数的中位数 BubbleSort(a, p + 5 * i, p + 5 * i + 4); Swap(ap + 5 * i + 2, ap + i); /找中位数的中位数 Type x = Select(a, p, p + (r - p - 4) / 5, (r - p - 4) / 10); int i = Partition(a, p, r, x); int j = i - p + 1; if (k = j) return Select(a, p, i, k); else return Select(a, i + 1, r, k - j);


    注意事项

    本文(计算机算法实验1 分治与递归 报告.docx)为本站会员主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2008-2022 冰点文档网站版权所有

    经营许可证编号:鄂ICP备2022015515号-1

    收起
    展开