ImageVerifierCode 换一换
格式:DOCX , 页数:25 ,大小:467.09KB ,
资源ID:5516689      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/5516689.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(算法设计实验报告.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

算法设计实验报告.docx

1、算法设计实验报告目录二分查找算法和快速排序算法 1(二)、快速排序问题 6矩阵连乘问题和0-1背包问题 8(一)、矩阵连乘问题 8(二)、0-1背包问题 14贪心算法最优装载问题 18贵州师范大学数学与计算机科学学院实验报告课程名称:算法设计与分析 班级: 13计本 实验日期: 2015.11.3 学号: 130702010047 姓名: 二 指导教师:熊祥光 成绩: 一、实验名称二分查找算法和快速排序算法二、实验目的及要求1、掌握分治法的基本思想;2、利用分治法思想,编程实现二分查找算法和快速排序算法;3、能对所设计算法的计算复杂性进行分析;4、对于给定的实例,能给出相应算法的计算过程。三、

2、实验工具XP系统或Win 7系统,编程语言不限四、实验内容(一)、二分查找问题1、编程语言不限,实现二分查找算法并对算法的复杂性进行分析。源程序:#include #define N 5int Binarysearch(int a,int k,int n);main() int aN; printf(请输入数组元素:); for(int i=0;iN;i+) scanf(%d,&ai); int n; printf(请输入数组长度:); scanf(%d,&n); int x; printf(请输入要查询的数:); scanf(%d,&x); n = Binarysearch(a,x,n);

3、if(n0) printf(无法找到该数!n); else printf(所查找的值:%d 的位置是: %dn, x, n); return 0;int Binarysearch(int a,int x,int n) int left=0;int right=n-1; while(leftamiddle) left=middle+1; else right=middle-1; return -1;二分查找算法复杂性分析:每执行一次算法的while循环,待搜索数组的大小就减小一半,所以在最坏情况下,while循环被执行了O(logn)次。循环体内需要O(1)时间。所以最坏情况下时间复杂度为O(l

4、ogn)。2、在二分查找算法的基础上,实现三分查找算法并对算法的复杂性进行分析。源程序如下:#include#define N 6int search(int bN,int x) int low =0; int high =N-1; while (low=high) int m1 =(high-low)/3+low; int m2=high-(high-low)/3; if (x=bm1) return m1; else if (xbm2) high=m2-1; else low=m1+1; high=m2-1; return -1;int main() int sN; int y; prin

5、tf(请输入序列:n); for (int i=0;i-1) printf(位置为:%dn,a); else printf(没有找到该数n); return 0; 三分搜索技术时间复杂性分析:T(n)=O(1),当n=1时,T(n)= T()+O(1),当n1时。总的来说T(n)=O()3、给定有序序列A=1,2,3,4,5,6,给出分别用二分和三分查找算法查找元素a=4和a=0的过程。1、二分查找(1)a=4设置两个变量i,j,排序开始的时候i=0,j=n-1=5;i=0 ; j=5;(1)假设指针 low和high分别为待查元素4所在范围的上界和下界,指针mid=(low+high)/2=

6、3;(2)先将ST.elemmid.key与给定值key比较,34,说明待查元素若存在,必在区间mid-1,low之间,则令指针high指向mid-1个元素,重新求得mid=(4+4)/2=4;比较ST.elemmid.key与给定值key,相等,查找成功,所查元素在序列中第三个位置。2.a=0i=0;j=5;(1)假设指针 low和high分别为待查元素0所在范围的上界和下界,指针mid=(low+high)/2=3;(2)先将ST.elemmid.key与给定值key比较,30,说明待查元素若存在,必在区间mid-1,low之间,则令指针high指向mid-1个元素,重新求得mid=(1+

7、2)/2=1(3仍将ST.elemmid.key与给定值key比较,10,说明待查元素若存在,必在区间mid-1,low之间,则令指针high指向mid-1个元素,上界和下界都指向同第一个元素仍没有找到,此时可以得出不存在该元素 。2、三分查找分析过程A=1,2,3,4,5,6查找4 left=0 m1 =1 m2= 4 right=5 Am14Am2 left=m1+1 right=m2-1=3 m1=2 m2=3 4=Am2 已找到 位置为m2=3;查找0 left=0 m1 =1 m2= 4 right=50Am1 right=m1-1 left=0 m1=0 m2=0均不满足判断,所以

8、0不存在(二)、快速排序问题1、编程语言不限,实现快速排序算法并对算法的复杂性进行分析。#include#define N 6void quicksort(int a,int low,int high) int i,j,temp; i= low; j= high; temp=alow; if(low high) return; while(i!=j) while(aj=temp&ji) j-; if(ji) ai+=aj; while(aii) i+; if(ji) aj-=ai; ai=temp; quicksort(a, low,i-1); quicksort(a,i+1, high);v

9、oid main() int aN; printf(请输入数组:); for(int k=0;k6;k+) scanf(%d,&ak); quicksort(a,0,6); int i; for(i=0;i3,将5和3的位置互换;序列变为3 2 6 4 1 5(2)25,所以将5和6互换位置,序列变为3 2 5 4 1 6(4)51,所以互换位置,序列变为3 2 1 4 5 6(5)41,互换位置后序列变为1 2 3 4 5 6(8)然后23也不必换位置,i=j比较结束,序列为1 2 3 4 5 6五、实验心得贵州师范大学数学与计算机科学学院实验报告课程名称:算法设计与分析 班级13计本 实验

10、日期:2015/11/13学号:130702010047 姓名: 二 指导教师:熊祥光 成绩: 一、实验名称矩阵连乘问题和0-1背包问题二、实验目的及要求 1、掌握动态规划的基本思想;2、采用动态规划思想,编程实现矩阵连乘算法和0-1背包算法;3、能分析所设计算法的计算复杂性;4、对于给定的实例,能给出相应算法的计算过程。三、实验工具XP系统或Win 7系统,编程语言不限四、实验内容(一)、矩阵连乘问题1、编程语言不限,实现矩阵连乘问题的动态规划算法并对算法的复杂性进行分析。源程序:#include #define N 30void matrixChain (int p,int mN+1N+1

11、,int bN+1N+1) /函数定义; int n=N; for (int i=1;i=n;i+) mii=0; int r; for (r=2;r=n;r+) int i; for ( i=1;i=n-r+1;i+) int j=i+r-1; mij=mi+1j+pi-1*pi*pj; bij=i; int k; for ( k=i+1;kj;k+) int d=mik+mk+1j+pi-1*pk*pj; if (dmij) mij=d; bij=k; void traceback (int i,int j,int bN+1) if (i=j) printf (A%d,i); else p

12、rintf (); traceback (i,bij,b); traceback(bij+1,j,b); printf (); main () int n; int a2*N; int cN+1,flag=1; int mN+1N+1; int bN+1N+1; printf (请输入矩阵的个数:); scanf (%d,&n); for (int i=0;i=2*n-1;i+) if (i%2=0) printf (请输入A%d的行:,(i/2)+1); else printf (列:); scanf (%d,&ai); for (i=1;i=2*n-2;i+) if (i%2!=0&ai!

13、=ai+1) flag=0; break; int j; for ( j=1;j=n-1;j+) cj=a2*j; if (flag!=0) c0=a0; cn=a2*n-1; matrixChain (c,m,b); printf (最优解的结构为:n); traceback(1,n,b); printf (n); printf (最小数乘次数为%dn,m1n); else printf (这%d个矩阵不能连乘!n,n); return 0;两个矩阵能够相乘的条件是第一个矩阵的列要等于第二个矩阵的行,如下图所输入的矩阵的值就不能相乘。算法复杂度分析:算法matrixChain的主要计算量取决

14、于算法中对r,i和k的3重循环。循环体的计算量为O(1),而3重循环的总次数为O(n3)。因此算法的计算时间上界为O(n3)。算法所占用的空间显然为O(n2)。2、若A1的大小为3020,A2的大小为205,A3的大小为515,A4的大小为1520,A5的大小为2020,A1的大小为2035,根据矩阵连乘问题的动态规划的算法思想,给出最优计算次序的过程。计算最优次序过程为:A1A2A3A4A5A630 2020 55 1515 2020 2020 35根据公式:m12=A1A2=30205=3000m23=A2A3=20515=1500m34=A3A4=51520=1500,m45=A4A5=

15、152020=6000m56=A5A6=202035=14000m13=A1A2A3=min=min5250,10500=5250m24=A2A3A4=min=min7500,3500=3500m35=A3A4A5=min=min7500,3500=3500m46=A4A5A6=min=min16500,24500=16500=7500=5500=7000=9500=10500=15250最优解为:(A1A2)( (A3A4)A5)A6)(二)、0-1背包问题1、编程语言不限,实现0-1背包问题的动态规划算法并对算法的复杂性进行分析。源程序:#includeint V1515; int max

16、(int m,int g) /求最大值 if(m=g) return m; /m表示物品的重量 else return g; /g表示背包的容量int KnapSack(int n,int w,int v,int x,int C) int i,j; for(i=0;i=n;i+) Vi0=0; /表示有物品i,但是背包容量为0 for(j=0;j=C;j+) V0j=0; /表示背包有容量,但是没有物品 for(i=0;i=n-1;i+) for(j=0;j=C;j+) if(j=0;i-) if(VijVi-1j) xi=1; /将物品i装入背包的情况 j=j-wi; else xi=0;

17、/物品i没有被装入背包 printf(选中的物品是:n); for(i=0;in;i+) printf(%d ,xi); printf(n); return Vn-1C; main() int s; int w15; int v15; int x15; int n,i; int C; n=5; printf(请输入背包的最大容量:n); scanf(%d,&C); printf(输入物品数:n); scanf(%d,&n); printf(请分别输入物品的重量:n); for(i=0;in;i+) scanf(%d,&wi); printf(请分别输入物品的价值:n); for(i=0;im2

18、5 物品1被选x1=1 c= 5- w1=3m23m33 物品2被选 x2=1 c= 3- w2=2m32=m42 物品3未被选 x3=0m42m52 物品4被选 x4=1 c= 2- w2=0m52=0 物品5未被选x5=0X1X2X3x4X511010贵州师范大学数学与计算机科学学院实验报告课程名称:算法设计与分析 班级:13计本 实验日期:2015/12/5 学号:130702010047 姓名 陈美 指导教师:熊祥光 成绩: 一、实验名称贪心算法最优装载问题二、实验目的及要求1、掌握贪心算法的基本思想;2、利用贪心算法思想,编程实现最优装载问题;3、能对所设计算法的计算复杂性进行分析;

19、4、对于给定的实例,能给出相应算法的计算过程。三、实验工具XP系统或Win 7系统,编程语言不限四、实验内容1、编程语言不限,实现教材P95页的货船最优装载算法并对该算法的复杂性进行分析。程序源代码如下:#includevoid Sort(int *w,int *t,int n) int i,j,count=0; int *s=new intn+1; for(i=1;i=n;i+) si=wi; for(i=1;i=n;i+) ti=0; for(i=0;i=n;i+) count=0; for(j=0;jsj) count+; while(tcount!=0) count+; tcount=

20、i; void loading(int w,int x,int c,int n) int *t =new int n+1; Sort(w,t,n); /排序 for(int i =1 ;i=n;i+) xi=0; for(int j =1;j=n&wtj=c;j+) xtj=1; c=c-wtj; int main() int X20,W20,n,c; printf(请输入船只载重:); scanf(%d,&c); printf(请输入集装箱数量:); scanf(%d,&n); printf(输入物品的重量序列:); for(int i=1;i=n;i+) scanf(%d,&Wi); lo

21、ading(W,X,c,n); printf(最优装载为); for(int j=1;j=n;j+) printf(% d,Xj); printf(n); return 0; 实验截图如下:时间复杂度分析: 算法的主要计算量在于将集装箱依其重量从小到大排序,程序中有两个嵌套for循环,所以复杂性为:O(n*n)。2、假设某公司现有8个集装箱急需搬上一艘大货船,它们的重量分别是W0,W2,W7=100,200,50,90,150,50,20,80,船只载重C=400。求该条件下的最优装载问题。(要求给出具体的过程) 解答过程如下:从剩下的集装箱中,选择重量最小的集装箱。这种选择次序可以保证所选的集装箱总重量最小,从而可以装载更多的集装箱。根据这种贪心策略,首先选择最轻的集装箱,然后选择次轻的,如此下去直到所有集装箱均装上船或船上不能容纳其他集箱。n=8,W1,W2,W8=100,200,50,90,150,50,20,80,c=400。利用贪心算法时,所考察集装箱的顺序为7,3,6,8,4,1,5,2。集装箱7,3,6,8,4,1的总重量为390个单位且已被装载,剩下的装载能力为10个单

copyright@ 2008-2022 冰豆网网站版权所有

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