《算法设计与分析》实验报告.docx

上传人:b****8 文档编号:30145794 上传时间:2023-08-05 格式:DOCX 页数:25 大小:36.51KB
下载 相关 举报
《算法设计与分析》实验报告.docx_第1页
第1页 / 共25页
《算法设计与分析》实验报告.docx_第2页
第2页 / 共25页
《算法设计与分析》实验报告.docx_第3页
第3页 / 共25页
《算法设计与分析》实验报告.docx_第4页
第4页 / 共25页
《算法设计与分析》实验报告.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

《算法设计与分析》实验报告.docx

《《算法设计与分析》实验报告.docx》由会员分享,可在线阅读,更多相关《《算法设计与分析》实验报告.docx(25页珍藏版)》请在冰豆网上搜索。

《算法设计与分析》实验报告.docx

《算法设计与分析》实验报告

算法设计与分析课程实验项目目录

学生:

学号:

序号

实验项目编号

实验项目名称

*实验项目类型

成绩

指导教师

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;l

scanf("%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(i

swap(&A[i],&A[j]);//撤销i>=j时最后一次交换

swap(&A[l],&A[j]);

returnj;

}

intquicksort(intA[100],intl,intr)

{

ints;

if(l

s=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;i

scanf("%d",&a[i]);

s=partition(a,0,i-1);

quicksort(a,1,s-1);

quicksort(a,s+1,i-1);

printf("排序后的结果为:

");

for(j=0;j

printf("%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;k

for(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;j

if(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;i

b[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;n

b[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;i

scanf("%d",&a[i]);

sort(a);

printf("排序后的数组为:

\n");

for(i=0;i

printf("%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);}

运行结果如下:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 哲学

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

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