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