计算机算法实验1 分治与递归 报告.docx
- 文档编号:10485929
- 上传时间:2023-02-13
- 格式:DOCX
- 页数:21
- 大小:114.65KB
计算机算法实验1 分治与递归 报告.docx
《计算机算法实验1 分治与递归 报告.docx》由会员分享,可在线阅读,更多相关《计算机算法实验1 分治与递归 报告.docx(21页珍藏版)》请在冰豆网上搜索。
计算机算法实验1分治与递归报告
《算法设计与分析》
姓名:
班级:
学号:
课题:
分治与递归
指导教师:
2013/12/24
目录
1实验目的与要求1
2实验内容1
2.1基本题一:
基本递归算法1
2.1.1问题概述1
2.1.2实验截图1
2.2基本题二:
棋盘覆盖问题3
2.2.1问题概述3
2.2.2实验截图4
2.3提高题一:
二分搜索5
2.3.1问题概述5
2.3.2实验截图5
2.4提高题二:
用分治法实现元素选择7
2.4.1问题概述7
2.4.2实验截图8
3实验心得9
说明:
代码在最后
1实验目的与要求
1)熟悉C/C++语言的集成开发环境
2)通过本实验加深对递归过程的理解
3)掌握递归算法的概念和基本思想,分析并掌握“整数划分”问题的递归算法
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问题概述
在一个2k×2k个方格组成的棋盘中,恰有一个方格与其它方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。
在棋盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。
2.2.2实验截图
比如输入8,代表8×8的棋盘,输出的数代表L型骨牌的编号。
本题编号从零开始,所以输入1,1代表第二行第二列为特殊方格,结果如下:
换一个数据,比如4×4,结果如下:
2.3提高题一:
二分搜索
2.3.1问题概述
1、设a[0:
n-1]是一个已排好序的数组。
请改写二分搜索算法,使得当搜索元素x不在数组中时,返回小于x的最大元素的位置I和大于x的最大元素位置j。
当搜索元素在数组中时,I和j相同,均为x在数组中的位置。
2、设有n个不同的整数排好序后存放于t[0:
n-1]中,若存在一个下标I,0≤i<n,使得t[i]=i,设计一个有效的算法找到这个下标。
要求算法在最坏的情况下的计算时间为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,1≤k≤n,输出这n个元素中第k小元素的值及其位置。
简述该算法的原理、步骤。
对该算法与直接排序查找进行比较,测试要求:
元素个数不少于100;分三种情况:
k=1、k=n和k=中位数。
2.4.2实验截图
共有100个数据,查找第1小的元素:
查找第50小的元素:
查找第100小的元素:
3实验心得
这次实验主要是分治与递归思想的运用。
通过这些题目,我比较深入地理解了递归与分治算法的要点。
当然现在使用还不熟练,许多题目还要参考书本和网上的资料才能编写代码。
以后还要好好学习算法知识,毕竟学习软件离不开算法,只有把算法学习好了,才能写出优秀的代码,因为算法是软件的灵魂嘛。
算法确实很难,由其在起步阶段更是如此。
但是学习是个长期的过程,一定不能轻言放弃。
见习的阶段本来就会在挫败中成长,我会坚持下去,争取在算法界占据一席之地。
1基本题一:
基本递归算法
#include
usingnamespacestd;
intmain()
{
intn,m;
cout<<"inputn,m:
"< cin>>n>>m; intf(int,int); cout<<"划分个数为: "< return0; } intf(intq,intp) { if(q==1||p==1)return1; elseif(q elseif(q==p)return1+f(q,p-1); returnf(q,p-1)+f(q-p,p); } 2基本题二: 棋盘覆盖问题 #include usingnamespacestd; inttile=1;//L型骨牌的编号(递增) intboard[100][100];//棋盘 /* *tr--当前棋盘左上角的行号 *tc--当前棋盘左上角的列号 *dr--当前特殊方格所在的行号 *dc--当前特殊方格所在的列号 *size: 当前棋盘的: 2^k */ voidmain() { intsize; voidchessBoard(int,int,int,int,int); cout<<"输入棋盘的大小(必须是2的整数次幂): "; cin>>size; intindex_x,index_y; cout<<"输入特殊方格位置的坐标: "; cin>>index_x>>index_y; chessBoard(0,0,index_x,index_y,size); for(inti=0;i { for(intj=0;j cout< cout< } } voidchessBoard(inttr,inttc,intdr,intdc,intsize) { if(size==1)//棋盘方格大小为1,说明递归到最里层 return; intt=tile++;//每次递增1 ints=size/2;//棋盘中间的行、列号(相等的) //检查特殊方块是否在左上角子棋盘中 if(dr chessBoard(tr,tc,dr,dc,s); else//不在,将该子棋盘右下角的方块视为特殊方块 { board[tr+s-1][tc+s-1]=t; chessBoard(tr,tc,tr+s-1,tc+s-1,s); } //检查特殊方块是否在右上角子棋盘中 if(dr chessBoard(tr,tc+s,dr,dc,s); else//不在,将该子棋盘左下角的方块视为特殊方块 { board[tr+s-1][tc+s]=t; chessBoard(tr,tc+s,tr+s-1,tc+s,s); } //检查特殊方块是否在左下角子棋盘中 if(dr>=tr+s&&dc chessBoard(tr+s,tc,dr,dc,s); else//不在,将该子棋盘右上角的方块视为特殊方块 { board[tr+s][tc+s-1]=t; chessBoard(tr+s,tc,tr+s,tc+s-1,s); } //检查特殊方块是否在右下角子棋盘中 if(dr>=tr+s&&dc>=tc+s)//在 chessBoard(tr+s,tc+s,dr,dc,s); else//不在,将该子棋盘左上角的方块视为特殊方块 { board[tr+s][tc+s]=t; chessBoard(tr+s,tc+s,tr+s,tc+s,s); } } 3提高题一: 二分搜索 (1)改写 #include usingnamespacestd; intbinarySearch(inta[],intn,intx,int&i,int&j)//a[]为要搜索的数组;n为数组元素的个数;x为要查询的元素值;i为小于x的最大元素位置;j为大于x的最小元素的位置 { intmiddle;//中值 intright=n-1;//数组的右边界 intleft=0;//数组的左边界 while(left<=right) { middle=(left+right)/2; if(x==a[middle]) { i=j=middle; returnmiddle; } if(x>a[middle]) left=middle+1; else right=middle-1; i=right; j=left; } return-1;//查询失败 } intmain() { inti; intj; intm;//要查找的数据 intmiddle; intb[]={1,2,3,4,5,6,7,8,12,22};//用来测试的数组 cout<<"预设数组为: "< for(i=0;i<10;i++) cout< cout<<"请输入要查找的数据: "< cin>>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); } return0; } (2)找下标 #include usingnamespacestd; intsearch(inta[],intn) { intleft=0; intright=n-1; while(left<=right) { intmid=(left+right)/2; if(a[mid]==mid)returnmid; if(a[mid] elseright=mid-1; } return-1; } intmain() { inta[]={-4,-2,1,2,3,4,5,7,9};//可以将7改为8,则查找不出符合要求的值 intm;//要查询的数据 intn; cout<<"预设数组为:=tc+s)//在