《算法设计与分析》实验报告.docx
《《算法设计与分析》实验报告.docx》由会员分享,可在线阅读,更多相关《《算法设计与分析》实验报告.docx(25页珍藏版)》请在冰豆网上搜索。
《算法设计与分析》实验报告
算法设计与分析课程实验项目目录
学生:
学号:
序号
实验项目编号
实验项目名称
*实验项目类型
成绩
指导教师
1
蛮力法
验证或设计(可选)
2
分治算法
验证或设计(可选)
3
减治法
验证
4
时空权衡
验证
5
动态规划
设计
6
贪婪技术
验证或设计(可选)
*实验项目类型:
演示性、验证性、综合性、设计性实验。
*此表由学生按顺序填写。
本科实验报告专用纸
课程名称算法设计与分析成绩评定
实验项目名称蛮力法指导教师
实验项目编号实验项目类型设计实验地点机房
学生学号
学院信息科学技术学院数学系信息与计算科学专业级
实验时间2012年3月1日~6月30日温度24℃
1.实验目的和要求:
熟悉蛮力法的设计思想。
2.实验原理和主要容:
实验原理:
蛮力法常直接基于问题的描述和所涉及的概念解决问题。
实验容:
以下题目任选其一
1).为蛮力字符串匹配写一段可视化程序。
2).写一个程序,实现凸包问题的蛮力算法。
3).最著名的算式谜题是由大名鼎鼎的英国谜人H.E.Dudeney(1857-1930)给出的:
.这里有两个前提假设:
第一,字母和十进制数字之间一一对应,也就是每个字母只代表一个数字,而且不同的字母代表不同的数字;第二,数字0不出现在任何数的最左边。
求解一个字母算术意味着找到每个字母代表的是哪个数字。
请注意,解可能并不是唯一的,不同人的解可能并不相同。
3.实验结果及分析:
(将程序和实验结果粘贴,程序能够注释清楚更好。
)
本科实验报告专用纸(附页)
该算法程序代码如下:
#include"stdafx.h"
#include"time.h"
intmain(intargc,char*argv[])
{
intx[100],y[100];
inta,b,c,i,j,k,l,m,n=0,p,t1[100],num;
intxsat[100],ysat[100];
printf("请输入点的个数:
\n");
scanf("%d",&num);
getchar();
clock_tstart,end;
start=clock();
printf("请输入各点坐标:
\n");
for(l=0;lscanf("%d%d",&x[l],&y[l]);
getchar();
}
xsat[0]=x[0];
ysat[0]=y[0];
for(i=0;;){//开始进行计算
for(j=0;j<=num-1;j++){
if(x[j]==xsat[i]&&y[j]==ysat[i]){
continue;
}
if(xsat[i]==xsat[0]&&ysat[i]==ysat[0]&&x[j]==xsat[num]&&y[j]==ysat[num]){
continue;
}
for(m=0;m<=n;m++)
if(x[j]==xsat[m]&&y[j]==ysat[m])
gotostep;
a=y[j]-ysat[i];
b=xsat[i]-x[j];
c=xsat[i]*y[j]-ysat[i]*x[j];
for(k=0,l=0;k<=num-1;k++,l++){
if(k==j||x[k]==xsat[i]&&y[k]==ysat[i]){
l=l-1;
continue;}
本科实验报告专用纸(附页)
if(a*x[k]+b*y[k]t1[l]=-1;
else
t1[l]=1;
if(l!
=0)
if(t1[l]*t1[l-1]<0)
break;
}
if(k==num){
i++;
if(i==1&&p!
=0){
xsat[num]=x[j];ysat[num]=y[j];
i--;
p=0;
n--;
}
else{
xsat[i]=x[j];ysat[i]=y[j];
}
n++;
break;
}
else
continue;
step:
;
}
if(xsat[i]==xsat[num]&&ysat[i]==ysat[num])
break;
}
//输出各点坐标
printf("\n\n该算法所得各点对应的坐标为:
\n");
for(intq=0;xsat[q]!
=-858993460;q++)
printf("(%d,%d)\n",xsat[q],ysat[q]);
end=clock();
printf("\n该算法进行所需要的时间为:
%f秒\n",(double)(end-start)/1000);
return0;
}
本科实验报告专用纸(附页)
运行结果如下:
4.教师评语、评分:
本科实验报告专用纸
课程名称算法设计与分析成绩评定
实验项目名称分治法指导教师
实验项目编号实验项目类型验证或设计实验地点机房
学生学号
学院信息科学技术学院数学系信息与计算科学专业级
实验时间2012年3月1日~6月30日温度24℃
1.实验目的和要求:
熟悉分治法的设计思想。
2.实验原理和主要容:
实验原理:
分治法的三个步骤:
分划、求解子问题、合并子问题的解。
实验容:
以下题目任选其一
1).写一个程序,实现快速排序算法。
用该算法处理一批输入样本。
2).Tromino谜题:
Tromino是一个由棋盘上的三个邻接方块组成的L形瓦片。
我们的问题是,如何用Tromino覆盖一个缺少了一个方块(可以在棋盘上的任何位置),的
棋盘。
除了这个缺失的方块,Tromino应该覆盖棋盘上的所有方块,而且不能有重叠。
为此问题设计一个分治算法。
3.实验结果及分析:
(将程序和实验结果粘贴,程序能够注释清楚更好。
)
本科实验报告专用纸(附页)
该算法程序代码如下:
#include"stdafx.h"
voidswap(int*x,int*y)
{
intt;t=*x;*x=*y;*y=t;
}
intpartition(intA[100],intl,intr)
{
intp,i,j;
p=A[l];
i=l;j=r+1;
do{
do{
i=i+1;
if(i>j)
break;
}while(A[i]
do{
j=j-1;
if(j
break;
}while(A[j]>p);
swap(&A[i],&A[j]);
}while(iswap(&A[i],&A[j]);//撤销i>=j时最后一次交换
swap(&A[l],&A[j]);
returnj;
}
intquicksort(intA[100],intl,intr)
{
ints;
if(ls=partition(A,l,r);
if(l>=r)
gotoend;
quicksort(A,l,s-1);
quicksort(A,s+1,r);
end:
本科实验报告专用纸(附页)
return0;}
voidmain(intargc,char*argv[])
{
inta[100],x,s,j,i;
printf("请输入您要排序的样本:
\n");
scanf("%d",&x);
for(i=0;iscanf("%d",&a[i]);
s=partition(a,0,i-1);
quicksort(a,1,s-1);
quicksort(a,s+1,i-1);
printf("排序后的结果为:
");
for(j=0;jprintf("%d",a[j]);
}
程序运行结果如下:
4.教师评语、评分:
本科实验报告专用纸
课程名称算法设计与分析成绩评定
实验项目名称减治法指导教师
实验项目编号实验项目类型验证实验地点机房
学生学号
学院信息科学技术学院数学系信息与计算科学专业级
实验时间2012年3月1日~6月30日温度24℃
1.实验目的和要求:
熟悉减治法的设计思想。
2.实验原理和主要容:
实验原理:
减治法的三个步骤:
将问题实例缩小为规模更小的实例、求解小规模实例、通过较小规模实例的解获得原问题的解。
实验容:
以下题目任选其一
1).利用深度或广度优先查找,设计一个程序,对于一个给定的图,它能够输出每一个连通分量的顶点,并且能输出图的回路,或者返回一个消息表明图是无环的。
2).设计一个程序实现两种拓扑排序算法:
DFS算法和减一算法并做一个实验来比较它们的运行时间。
3).编写程序实现选择问题,即求一个n个数列表的第k个最小元素。
3.实验结果及分析:
(将程序和实验结果粘贴,程序能够注释清楚更好。
)
本科实验报告专用纸(附页)
算法程序代码如下:
#include"stdio.h"
intmain()
{intQSort(int[],int,int);
inta[11];
intk;
printf("请输入一个11个数的数列:
\n");
for(k=0;k<11;k++)
scanf("%d",&a[k]);
QSort(a,0,10); }
intQSort(inta[],intleft,intright)
{inti,j,temp,m=6;
i=left;
j=right;
temp=a[left];
if(left>right)
return0;
while(i!
=j)
{while(a[j]>=temp&&j>i)
j--;
if(j>i) a[i++]=a[j];
while(a[i]<=temp&&j>i)i++;
本科实验报告专用纸(附页)
if(j>i)
a[j--]=a[i];}
a[i]=temp;
if(i>m)
QSort(a,left,i-1); //对左边的子表进行排序
elseif(i QSort(a,i+1,right); //对右边的子表进行排序
else printf("这个数列中的第K小元素为:
%d\n",a[i]); }
所得实验结果如下:
4.教师评语、评分:
本科实验报告专用纸
课程名称算法设计与分析成绩评定
实验项目名称时空权衡指导教师
实验项目编号实验项目类型验证实验地点机房
学生学号
学院信息科学技术学院数学系信息与计算科学专业级
实验时间2012年3月1日~6月30日温度24℃
1.实验目的和要求:
熟悉时空权衡的设计思想。
2.实验原理和主要容:
实验原理:
时空权衡是利用空间换取时间的算法。
实验容:
设计一个程序实现Boyer-Moore算法。
3.实验结果及分析:
(将程序和实验结果粘贴,程序能够注释清楚更好。
)
该算法程序如下:
#include
#include
inttable[28];
intpre[10];
intmax(intn,intm)
{if(n>=m)returnn;
elsereturnm;}
int*shifttable(charp[])
{
intm,i;
charc;
m=strlen(p);
for(c='a';c<='z';c++)
table[c-97]=m;
//table['']=100;
for(i=0;i<=m-2;i++)
table[p[i]-97]=m-1-i;
//table['\0'+27]=100;
table[''-6]=m;
returntable;}
int*prefixtable(charp[])
本科实验报告专用纸(附页)
{
intn,k,i,j,m;
n=strlen(p);
k=1;
i=n-2;
m=n-1;
while(i>=0){
if(p[i]==p[n-1]){pre[k]=n-1-i;break;}
i--;
}
/*for(k=2;k<=n-1;k++){
i=k;
while(p[n-i]!
=p[0]&&i>=0){
i--;
}
if(i>0){
j=0;
while(p[n-i]==p[j]&&i>0){
i--;
j++;
}
if(0==i)pre[k]=n-j;
}
elsepre[k]=n;
}*/
for(k=2;kfor(i=k;i>0;i--){
j=i;
m=n-1;
while(j>0&&p[j-1]==p[n-1+m-5]){
j--;
m--;
}
if(j==0){pre[k]=n-i;break;}
}
if(0==i)pre[k]=n;
}
returnpre;
}
intboyer_moore(charp[],chartext[])
{
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&&p[n-k-1]==text[i-k]){
k++;
}
if(k==n)returni-n+1;
else{
if(text[i-k]=='')
d1=max(shi[text[i-k]-6]-k,1);
else
d1=max(shi[text[i-k]-97]-k,1);
d2=pre[k];
if(0==k)i=i+d1;
elsei=i+max(d1,d2);}
}
return-1;}
voidmain()
{
//charp[]={"barber"};
//charp[]={"baobab"};
//charp[]={"abcbab"};
//int*t,i=0,*r,a;
//t=shifttable(p);
//printf("inputonenumber:
");
//scanf("%d",&a);
//while(i!
=28)
//printf("t[%d]pointto:
%d\n",i,t[i++]);
//r=prefixtable(p);
//for(i=1;i<6;i++)
//printf("r[%d]=%d\n",i,r[i]);
//getch();
inti;
charp[]={"baobab"};
chartext[]={"bessknewaboutbaobabs"};
i=boyer_moore(p,text);
printf("i=%d\n",i);
}
运行结果如下:
本科实验报告专用纸(附页)
4.教师评语、评分:
本科实验报告专用纸
课程名称算法设计与分析成绩评定
实验项目名称动态规划指导教师
实验项目编号实验项目类型设计实验地点机房
学生学号
学院信息科学技术学院数学系信息与计算科学专业级
实验时间2012年3月1日~6月30日温度24℃
1.实验目的和要求:
熟悉动态规划算法的设计思想。
2.实验原理和主要容:
实验原理:
动态规划算法的基本步骤是:
建立问题的解与其子问题的解之间的递推关系、将子问题的解用表格记录下来(自底向上或自顶向下),避免子问题的重复计算、上述表格的最终状态即为(包含)最终解。
实验容:
分别用动态规划算法和备忘录方法求解找零问题:
给定金额n以及各种硬币面额d1要求测试数据:
硬币面额{d1,d2,…,dm}={1,5,10,21,25},找零金额n=273。
3.实验结果及分析:
(将程序和实验结果粘贴,程序能够注释清楚更好。
)
该算法程序如下:
#include
intmain()
{
intd[3],i,n;
intZL(int[],int);
printf("输入4种硬币面额:
\n");
for(i=0;i<=3;i++)
本科实验报告专用纸(附页)
{scanf("%d",&d[i]);}
printf("输入要找零的金额:
\n");
scanf("%d",&n);
ZL(d,n);
}
intZL(intd[],intn)
{
inta,b,c,k;
a=n;
for(k=3;k>=0;k--)
{
c=a/d[k];
b=a-c*d[k];
a=b;
printf("面值为%d的找零个数为%d个\n",d[k],c);
}
}
程序运行结果如下:
4.教师评语、评分:
本科实验报告专用纸
课程名称算法设计与分析成绩评定
实验项目名称贪婪算法指导教师
实验项目编号实验项目类型验证或设计实验地点机房
学生学号
学院信息科学技术学院数学系信息与计算科学专业级
实验时间2012年3月1日~6月30日温度24℃
1.实验目的和要求:
熟悉贪婪算法的设计思想。
2.实验原理和主要容:
实验原理:
贪婪法在解决问题的策略上目光短浅,只根据当前已有的信息就做出选择,而且一旦做出了选择,不管将来有什么结果,该选择都不会改变。
换言之,贪婪法并不是从整体最优考虑,它所做出的选择只是在某种意义上的局部最优。
实验容:
以下题目任选其一
1).编写程序实现Prim算法。
2).数列极差问题:
在黑板上写了N个正整数作成的一个数列,进行如下操作:
每一次擦去其中的两个数a和b,然后在数列中加入一个数a×b+1,如此下去直至黑板上剩下一个数,在所有按这种操作方式最后得到的数中,最大的记作max,最小的记作min,求该数列的极差M=max-min。
利用贪婪算法编写程序实现数列极差问题。
3.实验结果及分析:
(将程序和实验结果粘贴,程序能够注释清楚更好。
)
本科实验报告专用纸(附页)
该算法程序如下:
#include
#include
#defineN6
voidsort(inta[])//用蛮力法将数列按从小到大的顺序排列
{
inti,j,k,t;
for(i=0;i{
k=i;
for(j=i+1;jif(a[j]k=j;
t=a[k];a[k]=a[i];a[i]=t;
}
}
intMax(inta[])//计算数列中a*b+1的最大值
{
inti,j,t,m,n,b[N];
for(i=0;ib[i]=a[i];
for(j=1;j{
t=b[j-1]*b[j]+1;
for(m=j+1;m<=N;m++)
{
if(t
{
for(n=j;nb[n]=b[n+1];
b[m-1]=t;
break;
}
}
}
returnb[N-1];
}
intMin(inta[])//计算数列中a*b+1的最小值
{
inti,t;
t=a[N-2];
for(i=N-2;i>=0;i--)
{t=t*a[i]+1;}
本科实验报告专用纸(附页)
returnt;}
voidmain()
{oidsort(inta[]);
intMax(inta[]);
intMin(inta[]);
inta[N],i,max,min,M;
printf("请输入一个数组:
\n");
for(i=0;iscanf("%d",&a[i]);
sort(a);
printf("排序后的数组为:
\n");
for(i=0;iprintf("%d",a[i]);
printf("\n");
max=Max(a);
printf("最大值为:
%d\n",max);
min=Min(a);
printf("最小值为:
%d\n",min);
M=max-min;
printf("该数组的极差为:
%d\n",M);}
运行结果如下: