算法实验报告qxf.docx
- 文档编号:8372610
- 上传时间:2023-01-30
- 格式:DOCX
- 页数:20
- 大小:125.66KB
算法实验报告qxf.docx
《算法实验报告qxf.docx》由会员分享,可在线阅读,更多相关《算法实验报告qxf.docx(20页珍藏版)》请在冰豆网上搜索。
算法实验报告qxf
算法分析与设计
实验报告
目录
实验一分治法实验日志3
实验二贪心算法实验日志5
实验三动态规划实验日志7
实验四回溯法实验日志9
附录11
实验一1题归并排序.cpp11
实验一2题快速排序.cpp12
实验二1题贪心法求背包问题.cpp13
实验二2题贪心法求最短路径.cpp16
实验三动态规划求最短路径.cpp17
实验四回溯法求背包.cpp18
实验一分治法实验日志
实验题目:
实验一分治法
实验目的:
1.掌握分治法思想;
2.熟练运用分治法解决相应的问题。
实验要求:
1.写一个“由底向上”的归并分类排序算法。
2.用快速分类算法对10个数(键盘输入)进行从大到小或从小到大的排列并输出结果。
实验主要步骤:
第一题:
写一个“由底向上”的归并分类排序算法
1.理解思想,为了解决一个大的问题,可以:
把它分成两个或多个更小的问题;分别解决每个小问题;把各小问题的解答组合起来,即可得到原问题的解答。
小问题通常与原问题相似,可以递归地使用分而治之策略来解决
2.编写分类子程序voidMergeSort(intR[]),采用自底向上的方法,对R[1..n]进行二路归并排序,此程序是上层函数,要调用解决子问题的函数。
3.编写函数voidMergePass(intR[],intlength);对R[1..n]做一趟归并排序
4.编写合并函数voidMerge(intR[],intlow,intm,inthigh);//将两个有序的子文件R[low..m)和R[m+1..high]归并成一个有序的
4.调试运行
第二题:
用快速分类算法对10个数(键盘输入)进行从大到小或从小到大的排列并输出结果
1.理解思想:
选取A(1:
n)的某个元素,譬如说t=A(s),然后将其他元素重新排列,使A(1:
n)中所在t以前出现的元素都小于或等于t,而所有在t后面出现的元素都大于或等于t。
文件的这种重新整理叫做划分,元素t称为划分元素。
因此,所谓快速分类就是通过反复对产生的文件进行划分来实现的。
2.编写分类子程序voidinputarr(intR[]);//从键盘输入10个数字存入R中
voidswap(intR[],intk,intj);//交换R[k]与R[j]的值
voidquicksort(intR[],intleft,intright);
3.核心代码:
voidquicksort(intR[],intleft,intright)
{
intj,last;
if(left>=right)//数组包含元素少于两个,直接返回
return;
swap(R,left,(left+right)/2);
last=left;
for(j=left+1;j<=right;j++)//left-last的值比last小,其余比last大
{
if(R[j] } swap(R,left,last); quicksort(R,left,last-1); quicksort(R,last+1,right); } 4.调试运行 实验结果: 图1.1第一题,归并排序 图1.2第二题,快速排序 心得体会: 通过这次实验,学到的东西很多,感触也很多,实在是获益菲浅! 从这个过程当中我已经收获了。 下面谈谈我在这次课程设计中遇到的一些问题以及一些个人愚见。 由于我们以前学过数据结构,C语言,JAVA语言和汇编语言,对软件的编程有一定的认识,对各种编程语言也都有一定程度的掌握,所以在做这个有关排序的算法实验是并不难于下手,分析老师的要求之后,我决定用C++对该系统进行编写。 所以在准备阶段我还是做得比较充分。 在这个阶段我主要是验证从技术上对该软件的各个方面的实现,最终编写出来了程序。 通过这次锻炼,最主要的不是对编程能力的提高,最重要的是站在算法的高度上对程序有了更深刻的认识. 在实验过程中,也遇到了一些小问题,比如第二题,调试时,输入是需要用逗号隔开.由于输入法的设置,采用的是半角输入,最后得到的结果是乱码. 实验二贪心算法实验日志 实验题目: 实验二贪心方法 实验目的: 1.掌握贪心算法的基本思想; 2.能用贪心算法的思想进行简单的程序设计。 实验要求: 1. (1)求以下情况背包问题的最优解: n=7,M=15,( )=(10,5,15,7,6,18,3)和( )=(2,3,5,7,1,4,1)。 (2)将以上数据情况的背包问题记为I。 设FG(I)是物品按 的非增次序输入时由GREEDY-KNAPSACK所生成的解,FO(I)是一个最优解。 问FO(I)/FG(I)是多少? (3)当物品按 的非降次序输入时,重复 (2)的讨论。 2.在下图的有向图中,利用算法SHORTEST-PATHS获取按长度非降次序排列的由结点1到其余结点最短路径长度。 实验主要步骤: 第一题: 背包问题 (1)设计思想: 不妨先取目标函数作为量度标准,即每装入一件物品就使背包获得最大可能的效益值增量。 在这种量度标准下的贪心方法就是按效益值的非增次序将物品一件件放到背包中去。 对于初始值不按非递进顺序的情况,需要先把P,W排序,最后输出时也需要按原来顺序输出解. (2)设计子函数: voidpaixu(intP[],intbiao[],intW[],intn);//返回P,W按P/W递增排序的结果,biao记录原位置 voidbeibao(intP[],intW[],intM,intX[],intn);//背包算法 voidbubblesort(floata[],intbiao[],intn);//对a冒泡排序,biao记录原位置 (3)编写子函数 背包算法,按照指导书和教材编写,问题不大. 排序算法代码: 详见附录. (3)调试运行 第二题: 最短路径 (1)设计思想: 通过分步方法求出最短路径。 每一步产生一个到达新的目的顶点的最短路径。 下一步所能达到的目的顶点通过如下贪心准则选取: 在还未产生最短路径的顶点中,选择路径长度最短的目的顶点。 (2)设计函数: voidshortestpath(intv,int(*cost)[7],intdist[],intn);//生成最短路径的贪心算法 (3)实现函数,按照实验指导书算法2.2进行编程.详细程序见附录. 实验结果: 图2.1按物品按 的非增次序输入时,背包问题最优解 图2.2SHORTEST-PATHS结点1到其余结点最短路径长度 心得体会: 对于第1题,用贪心算法求解背包问题的最优解.由于实验指导书已经给出了算法伪代码,和课堂上老师认真的讲解,编写求最优解的核心代码并不难.关键是在编写排序算法时,设计到要排序后按P/W递减顺序排列相关两个数组,而不是一个,同时调用完成求最优解后需要能够按照没有排序前的顺序返回结果.我利用一个变量数组biao[]来记录P,W原来所处的位置,最后在课堂下经过努力才完成了最终编程. 由于课本上已经给出了实现此算法的形式化描述,所以此次课设相对以前的c以及数据结构来说,是比较简单的,但有一点,输出路径需要自己设计,关于这一点我考虑了两种方法: 其中对于单源路径我使用的方法是: 定义一个一维数组,长度为图的结点个数,初始值为零,用来存放每个结点最短路径上的前一结点,最后根据这个数组的信息可以输出路径,为了使输出从起点到终点,还使用了递归。 实验三动态规划实验日志 实验题目: 实验三动态规划 实验目的: 1.掌握动态规划算法的基本思想; 2.运用动态规划算法的思想解决一些简化的实际问题。 实验要求: 已知图G(V,E)的距离矩阵如下,求其任意两点间的最短距离 实验主要步骤: (1)设计思想: 动态规划的实质是分治思想和解决冗余,因此,动态规划是一种将问题实例分解为更小的、相似的子问题,并存储子问题的解而避免计算重复的子问题,以解决最优化问题的算法策略。 用A[n][n]数组,存放最终的解,A[i][j]表示从I到j的最短路径,便利收索所有的I到k的长度,若加入新边后长度任然较小,就改变最小A[i][j].按此方法求出所有的A[][]. (2)设计主流程: a定义变量,用100代表无穷大.,CONST[7][7]存放邻接矩阵(从1开始使用,,0行0列都赋值为0); b.设计子函数voidallpath(int(*COST)[7],int(*A)[7],intn);//求解,A中存最终解.首先初始化A为COST,再逐步改变A中值 c.按照规定格式输出A中值为答案 (3)详细设计,程序清单见附录. 实验结果: 图3.1任意两点间的最短距离 100表示无穷大,第一行表示从V1点到个点的最短距离 心得体会: 对于这个实验的程序,我相信自己已有一定的认识,这个程序叫最短路径狄氏算法,所以不难明白,这个程序的主要作用是在一系列数据中找到最优的路径,做到以最快的速度完成任务,因此,这个程序的意义是很好的。 这个程序,学起来也不是特别困难,因为它的很多函数是我们曾经接触过的,也很容易去明白与掌握。 例如: 检查输入的边序号是否越界,若越界则重输voidCheck(intn,int&i,int&j)这个函数很好,它规定了序号的范围,如果程序在运行时,发现数据不在范围之内,那么就会显示输入错误,要求重新输入数据,看起来也不难明白,所以不再细说了。 实验四回溯法实验日志 实验题目: 实验四回溯法 实验目的: 1.掌握回溯算法的基本思想; 2.运用回溯算法的思想解决一些简化的实际问题。 实验要求: 已知有n种物品和一个可容纳M重量的背包,每种物品i的重量为w(i)。 假定将物品i放入背包就会得到i的价值v(i)。 算法要实现的就是采用回溯法使装入背包物品的总效益最大。 实验主要步骤: (1)设计思想: 确定了解空间组织结构后,回溯法就从根结点出发,以深度优先的方式搜索整个空间。 这个开始结点就成为一个活结点,同时也成为当前的扩展结点。 在当前的结点往下搜索,直到找完为止。 (2)找出叶子节点的表述形式,即是求的一个解得边界条件,tw<=limitw&&tv>maxv)//如果找到满足条件的更优解,保存它. (3)找出递推求解公式,其中,在对解X做出决策之后,问题处于下列两种状态之一: 背包的剩余容量是是M,没有产生任何效益;剩余容量是M-w,效益增长了p,显然对于剩下的n-1个物品的决策需要相对于X是一个最优解组,否则下不为最优决策序列.如果 Knap(i+1,tw+A[i].weight,tv+A[i].value);//选取第i个物品 Knap(i+1,tw,tv);//不选第i个物品,回溯 (4)根据边界条件和递推公式,写出回溯法的递归算法.程序见附录. (5)调试运行. 实验结果: 心得体会: 通过本次实验加深了我对回溯算法所给的模式的理解,同时对用回溯算法解决一个实际问题有了一个更深层次的认识。 回溯算法非递归的模式通用,用它解决一个问题的关键是找出合法解与部分解的判断条件,在合法解时书写相应程序段,在部分解时书写相应程序段。 另外注意有些条件部分解和合法解都要满足,此时要排除掉非法解,即要给它剪去。 另外需要注意的是回溯的过程。 这次试验是我本学期学习这门课的最后一次试验,有了前几次试验的经验和体会,这次试验比前几次做的轻松一点,但是自己在规定的短时间内自己完全写出试验程序还是有难度的,但是在细心的阅读理解了示例程序之后,读懂了试验的基本思想,明白了各个函数的作用并能够加入了自己的一部分程序,最后得出了试验结果。 虽然整个程序不是自己完全独立完成,但是还是有较大收获。 总的来说,通过这学期对这门课的学习和试验,对程序的编写和阅读能力都有较大的进步。 附录 实验一1题归并排序.cpp #include #include #include #definen10 voidMergeSort(intR[]);//采用自底向上的方法,对R[1..n]进行二路归并排序 voidMergePass(intR[],intlength);//对R[1..n]做一趟归并排序 voidMerge(intR[],intlow,intm,inthigh);//将两个有序的子文件R[low..m)和R[m+1..high]归并成一个有序的 voidmain() { inti,R[n+1]={100,6,8,9,4,2,5,3,0,4,7};//从R[1]开始排序 MergeSort(R); for(i=1;i<=n;i++) { printf("%d",R[i]); } } voidMergeSort(intR[])//采用自底向上的方法,对R[1..n]进行二路归并排序 { intlength; for(length=1;length MergePass(R,length); } voidMergePass(intR[],intlength)//对R[1..n]做一趟归并排序 { inti; for(i=1;i+2*length-1<=n;i=i+2*length) Merge(R,i,i+length-1,i+2*length-1);//归并长度为length的两个相邻子文件 if(i+length-1 Merge(R,i,i+length-1,n); } voidMerge(intR[],intlow,intm,inthigh)//将两个有序的子文件R[low..m)和R[m+1..high]归并成一个有序的 { inti=low,j=m+1,p=0; int*R1; R1=(int*)malloc((high-low+1)*sizeof(int)); if(! R1)//申请空间失败 printf("Insufficientmemoryavailable! "); while(i<=m&&j<=high)//两子文件非空时取其小者输出到R1[p]上 R1[p++]=(R[i]<=R[j])? R[i++]: R[j++]; while(i<=m)//若第1个子文件非空,则复制剩余记录到R1中 R1[p++]=R[i++]; while(j<=high)//若第2个子文件非空,则复制剩余记录到R1中 R1[p++]=R[j++]; for(p=0,i=low;i<=high;p++,i++) R[i]=R1[p];//归并完成后将结果复制回R[low..high] } //============================================================== //============================================================== 实验一2题快速排序.cpp #include #definen10 voidinputarr(intR[]); voidswap(intR[],intk,intj);//交换R[k]与R[j]的值 voidquicksort(intR[],intleft,intright); voidmain() { inti,R[n+1]; inputarr(R); quicksort(R,0,9); printf("\n"); for(i=0;i printf("%d",R[i]); printf("\n"); } voidinputarr(intR[]) { inti; printf("请输入%d个整数,用逗号隔开: \n",n); for(i=0;i { scanf("%d,",&R[i]); } } voidswap(intR[],intk,intj)//交换R[k]与R[j]的值 { inttemp; temp=R[k]; R[k]=R[j]; R[j]=temp; } voidquicksort(intR[],intleft,intright) { intj,last; if(left>=right)//数组包含元素少于两个,直接返回 return; swap(R,left,(left+right)/2); last=left; for(j=left+1;j<=right;j++)//left-last的值比last小,其余比last大 { if(R[j] } swap(R,left,last); quicksort(R,left,last-1); quicksort(R,last+1,right); } //============================================================= //============================================================= 实验二1题贪心法求背包问题.cpp #include voidpaixu(intP[],intbiao[],intW[],intn);//返回P,W按P/W递增排序的结果,biao记录原位置5,1,6,3,7,2,4 voidbeibao(intP[],intW[],intM,intX[],intn);//背包算法 voidbubblesort(floata[],intbiao[],intn);//对a冒泡排序,biao记录原位置 voidmain() { intn,M,P[8]={0,10,5,15,7,6,18,3},W[8]={0,2,3,5,7,1,4,1}; intX[8],i,j,biao[8],ans[8]={0,0,0,0,0,0,0,0}; n=7; M=15; paixu(P,biao,W,n); beibao(P,W,M,X,n); for(i=1;i<=n;i++) { if(X[i]==1){j=biao[i];ans[j]=1;}//找到原数组相应位置 } for(i=1;i<=n;i++) { printf("%d",ans[i]); } } voidpaixu(intP[],intbiao[],intW[],intn) { floattemp[8]; intinttemp1[8],inttemp2[8],i,j; for(i=1;i<=n;i++)//计算P/W { temp[i]=(P[i]+0.0)/W[i]; biao[i]=i; } bubblesort(temp,biao,n);//用冒泡排序法排序 for(i=1;i<=n;i++)//按p/w增序,将p,W分别放入缓冲数组 { j=biao[i]; inttemp1[i]=P[j]; inttemp2[i]=W[j]; } for(i=1;i<=n;i++)//刷新p,w,使之顺序符合要求 { P[i]=inttemp1[i]; W[i]=inttemp2[i]; } } voidbeibao(intP[],intW[],intM,intX[],intn) {//P(1: n)和W(1: n)分别含有按P(i)/W(i)≥P(i+1)/W(i+1) //排序的n件物品的效益值和重量。 M是背包的容量大笑,而X(1: n)是解 inti,cu; cu=M;//cu是背包剩余容量 for(i=1;i { X[i]=0; } for(i=1;i { if(W[i]>cu){ break;} else{ X[i]=1; cu=cu-W[i]; } } if(i<=n)X[i]=cu/W[i]; } voidbubblesort(floata[],intbiao[],intn) { inti,j,flag=1,bb; floattemp; for(i=n;i>0&&flag==1;--i) { flag=0; for(j=1;j {
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 实验 报告 qxf