1、 算法设计与分析 课程实验项目目录学生姓名: 学号: 序号实验项目编号实验项目名称*实验项目类型成绩指导教师120122229201蛮力法验证或设计(可选)220122229202分治算法验证或设计(可选)320122229203减治法验证420122229204时空权衡验证520122229205动态规划设计620122229206贪婪技术验证或设计(可选)*实验项目类型:演示性、验证性、综合性、设计性实验。*此表由学生按顺序填写。本科实验报告专用纸课程名称 算法设计与分析 成绩评定 实验项目名称 蛮力法 指导教师 实验项目编号 20122229201 实验项目类型 设计 实验地点 机房 学
2、生姓名 学号 学院 信息科学技术学院数学 系 信息与计算科学 专业 级 实验时间 2012年 3月 1 日6月30日 温度24 1. 实验目的和要求:熟悉蛮力法的设计思想。2. 实验原理和主要内容:实验原理:蛮力法常直接基于问题的描述和所涉及的概念解决问题。实验内容:以下题目任选其一1).为蛮力字符串匹配写一段可视化程序。2).写一个程序,实现凸包问题的蛮力算法。3).最著名的算式谜题是由大名鼎鼎的英国谜人H.E.Dudeney(1857-1930)给出的:. 这里有两个前提假设:第一,字母和十进制数字之间一一对应,也就是每个字母只代表一个数字,而且不同的字母代表不同的数字;第二,数字0不出现
3、在任何数的最左边。求解一个字母算术意味着找到每个字母代表的是哪个数字。请注意,解可能并不是唯一的,不同人的解可能并不相同。3. 实验结果及分析:(将程序和实验结果粘贴,程序能够注释清楚更好。)本科实验报告专用纸(附页) 该算法程序代码如下:#include stdafx.h#include time.hint main(int argc, char* argv)int x100,y100;int a,b,c,i,j,k,l,m,n=0,p,t1100,num;int xsat100,ysat100;printf(请输入点的个数:n);scanf(%d,&num);getchar();clock
4、_t start,end;start=clock();printf(请输入各点坐标:n);for(l=0;lnum;l+)/输入各点坐标scanf(%d%d,&xl,&yl);getchar();xsat0=x0;ysat0=y0;for(i=0;)/开始进行计算for(j=0;j=num-1;j+)if(xj=xsati & yj=ysati)continue;if(xsati=xsat0 & ysati=ysat0 & xj=xsatnum & yj=ysatnum)continue;for(m=0;m=n;m+)if(xj=xsatm & yj=ysatm)goto step;a=yj-
5、ysati;b=xsati-xj;c=xsati*yj-ysati*xj;for(k=0,l=0;k=num-1;k+,l+)if(k=j | xk=xsati & yk=ysati)l=l-1;continue;本科实验报告专用纸(附页) if(a*xk+b*ykc)t1l=-1;elset1l=1;if(l!=0)if(t1l*t1l-1j)break;while(Aip);doj=j-1;if(jp);swap(&Ai,&Aj);while(i=j时最后一次交换swap(&Al,&Aj);return j;int quicksort(int A100,int l,int r)int s;
6、if(l=r)goto end;quicksort(A,l,s-1);quicksort(A,s+1,r);end:本科实验报告专用纸(附页) return 0;void main(int argc, char* argv)int a100,x,s,j,i;printf(请输入您要排序的样本:n);scanf(%d,&x);for(i=0;ix;i+)scanf(%d,&ai);s=partition(a,0,i-1);quicksort(a,1,s-1);quicksort(a,s+1,i-1);printf(排序后的结果为:);for(j=0;jx;j+)printf(%d ,aj);程序
7、运行结果如下:4. 教师评语、评分:本科实验报告专用纸课程名称 算法设计与分析 成绩评定 实验项目名称 减治法 指导教师 实验项目编号20122229203实验项目类型 验证 实验地点 机房 学生姓名 学号 学院 信息科学技术学院数学 系 信息与计算科学 专业 级 实验时间 2012年 3月 1 日6月30日 温度24 1. 实验目的和要求:熟悉减治法的设计思想。2. 实验原理和主要内容:实验原理:减治法的三个步骤:将问题实例缩小为规模更小的实例、求解小规模实例、通过较小规模实例的解获得原问题的解。实验内容:以下题目任选其一1).利用深度或广度优先查找,设计一个程序,对于一个给定的图,它能够输
8、出每一个连通分量的顶点,并且能输出图的回路,或者返回一个消息表明图是无环的。2).设计一个程序实现两种拓扑排序算法:DFS算法和减一算法 并做一个实验来比较它们的运行时间。3).编写程序实现选择问题,即求一个n个数列表的第k个最小元素。3. 实验结果及分析:(将程序和实验结果粘贴,程序能够注释清楚更好。)本科实验报告专用纸(附页) 算法程序代码如下:#includestdio.hint main()int QSort(int ,int,int);int a11; int k; printf(请输入一个11个数的数列:n); for(k=0;kright) return 0; while(i!=
9、j)while(aj=temp & ji) j-; if(ji) ai+=aj; while(aii)i+;本科实验报告专用纸(附页) if(ji) aj-=ai; ai=temp; if(im) QSort(a,left,i-1); /对左边的子表进行排序 else if(im) QSort(a,i+1,right); /对右边的子表进行排序 else printf(这个数列中的第K小元素为:%dn,ai); 所得实验结果如下:4. 教师评语、评分:本科实验报告专用纸课程名称 算法设计与分析 成绩评定 实验项目名称 时空权衡 指导教师 实验项目编号20122229204实验项目类型 验证 实
10、验地点 机房 学生姓名 学号 学院 信息科学技术学院数学 系 信息与计算科学 专业 级 实验时间 2012年 3月 1 日6月30日 温度24 1. 实验目的和要求:熟悉时空权衡的设计思想。2. 实验原理和主要内容:实验原理:时空权衡是利用空间换取时间的算法。实验内容:设计一个程序实现Boyer-Moore算法。3. 实验结果及分析:(将程序和实验结果粘贴,程序能够注释清楚更好。)该算法程序如下:#include #include int table28;int pre10;int max(int n, int m)if(n = m) return n;else return m;int *
11、shifttable(char p) int m,i; char c; m = strlen(p); for(c=a; c=z; c+) tablec-97=m;/ table =100; for(i=0; i=0)if(pi=pn-1) prek=n-1-i;break;i-;/*for(k=2; k=0)i-;if(i0)j=0;while(pn-i=pj & i0)i-;j+;if(0=i) prek=n-j;else prek=n;*/for(k=2; k0; i-)j=i;m=n-1;while(j0 & pj-1=pn-1+m-5)j-;m-;if(j=0) prek=n-i;br
12、eak;if(0=i) prek=n;return pre;int boyer_moore(char p, char text)int *shi, *pre, i, k, m, n, d1, d2;shi = shifttable(p);pre = prefixtable(p);n = strlen(p);本科实验报告专用纸(附页) m = strlen(text);i = n-1;while(i=m-1)k=0;while(k=n-1 & pn-k-1=texti-k)k+;if(k=n) return i-n+1;elseif(texti-k= ) d1=max(shitexti-k-6-
13、k,1);elsed1 = max(shitexti-k-97-k,1);d2 = prek;if(0=k) i = i + d1;else i = i + max(d1,d2);return -1;void main()/ char p=barber;/char p=baobab;/char p=abcbab;/ int *t,i=0,*r,a;/ t = shifttable(p);/printf(input one number:);/scanf(%d, &a);/ while(i != 28)/ printf(t%d point to : %dn, i, ti+);/r = prefi
14、xtable(p);/for(i=1;i6;i+)/printf(r%d=%dn, i, ri);/ getch();int i;char p = baobab;char text = bess knew about baobabs;i = boyer_moore(p, text);printf(i= %dn, i);运行结果如下:本科实验报告专用纸(附页) 4. 教师评语、评分:本科实验报告专用纸课程名称 算法设计与分析 成绩评定 实验项目名称 动态规划 指导教师 实验项目编号20122229205实验项目类型 设计 实验地点 机房 学生姓名 学号 学院 信息科学技术学院数学 系 信息与计算
15、科学 专业 级 实验时间 2012年 3月 1 日6月30日 温度24 1. 实验目的和要求:熟悉动态规划算法的设计思想。2. 实验原理和主要内容:实验原理:动态规划算法的基本步骤是:建立问题的解与其子问题的解之间的递推关系、将子问题的解用表格记录下来(自底向上或自顶向下) ,避免子问题的重复计算、上述表格的最终状态即为(包含)最终解。实验内容:分别用动态规划算法和备忘录方法求解找零问题:给定金额n以及各种硬币面额d1d2dm ,其中d1=1. 求总金额等于n的硬币的最少个数,并输出每种硬币的找零数量。要求测试数据:硬币面额d1,d2,dm =1,5,10,21,25,找零金额n=273。3.
16、 实验结果及分析:(将程序和实验结果粘贴,程序能够注释清楚更好。)该算法程序如下:#include int main()int d3,i,n;int ZL(int ,int);printf(输入4种硬币面额:n);for(i=0;i=0;k-)c=a/dk;b=a-c*dk;a=b;printf(面值为%d的找零个数为%d个n,dk,c);程序运行结果如下:4. 教师评语、评分:本科实验报告专用纸课程名称 算法设计与分析 成绩评定 实验项目名称 贪婪算法 指导教师 实验项目编号20122229206实验项目类型 验证或设计 实验地点 机房 学生姓名 学号 学院 信息科学技术学院数学 系 信息与
17、计算科学 专业 级 实验时间 2012年 3月 1 日6月30日 温度24 1. 实验目的和要求:熟悉贪婪算法的设计思想。2. 实验原理和主要内容:实验原理:贪婪法在解决问题的策略上目光短浅,只根据当前已有的信息就做出选择,而且一旦做出了选择,不管将来有什么结果,该选择都不会改变。换言之,贪婪法并不是从整体最优考虑,它所做出的选择只是在某种意义上的局部最优。实验内容:以下题目任选其一1).编写程序实现Prim算法。2). 数列极差问题:在黑板上写了N个正整数作成的一个数列,进行如下操作:每一次擦去其中的两个数a和b,然后在数列中加入一个数ab+1,如此下去直至黑板上剩下一个数,在所有按这种操作
18、方式最后得到的数中,最大的记作max,最小的记作min,求该数列的极差M=max-min。利用贪婪算法编写程序实现数列极差问题。3. 实验结果及分析:(将程序和实验结果粘贴,程序能够注释清楚更好。)本科实验报告专用纸(附页) 该算法程序如下:#include #include #define N 6void sort(int a)/用蛮力法将数列按从小到大的顺序排列int i,j,k,t;for(i=0;iN-1;i+)k=i;for(j=i+1;jN;j+)if(ajak)k=j;t=ak;ak=ai;ai=t;int Max(int a)/计算数列中a*b+1的最大值int i,j,t,m
19、,n,bN;for(i=0;iN;i+)bi=ai;for(j=1;jN;j+)t=bj-1*bj+1;for(m=j+1;m=N;m+)if(tbm|m=N)for(n=j;n=0;i-)t=t*ai+1;本科实验报告专用纸(附页) return t;void main()oid sort(int a);int Max(int a);int Min(int a);int aN,i,max,min,M;printf(请输入一个数组:n);for(i=0;iN;i+)scanf(%d,&ai);sort(a);printf(排序后的数组为:n);for(i=0;iN;i+)printf(%d ,ai);printf(n);max=Max(a);printf(最大值为: %dn,max);min=Min(a);printf(最小值为: %dn,min);M=max-min;printf(该数组的极差为:%dn,M);运行结果如下:4. 教师评语、评分:20