精品文档算法设计与分析实验报告格式精选word文档 30页.docx
《精品文档算法设计与分析实验报告格式精选word文档 30页.docx》由会员分享,可在线阅读,更多相关《精品文档算法设计与分析实验报告格式精选word文档 30页.docx(24页珍藏版)》请在冰豆网上搜索。
精品文档算法设计与分析实验报告格式精选word文档30页
本文部分内容来自网络整理,本司不为其真实性负责,如有异议或侵权请及时联系,本司将立即删除!
==本文为word格式,下载后可方便编辑和修改!
==
算法设计与分析实验报告格式
算法设计与分析实验报告一
实验名称统计数字问题评分实验日期年月日指导教师刘长松姓名刘飞初专业班级计算机0901学号10
一.实验要求
1、掌握算法的计算复杂性概念。
2、掌握算法渐近复杂性的数学表述。
3、掌握用C++语言描述算法的方法。
4.实现具体的编程与上机实验,验证算法的时间复杂性函数。
二.实验内容
统计数字问题
1、问题描述
一本书的页码从自然数1开始顺序编码直到自然数n。
书的页码按照通常的习惯编排,每个页码都不含多余的前导数字0。
例如,第6页用数字6表示,而不是06或006等。
数字计数问题要求对给定书的总页码n,计算出书的全部页码中分别用到多少次数字0,1,2,…,9。
2、编程任务
给定表示书的总页码的10进制整数n(1≤n≤109)。
编程计算书的全部页码中分别用到多少次数字0,1,2,…,9。
三.程序算法
将页码数除以10,得到一个整数商和余数,商就代表页码数减余数外有多少个1—9作为个位数,余数代表有1—余数本身这么多个数作为剩余的个位数,此外,商还代表1—商本身这些数出现了10次,余数还代表剩余的没有计算的商的大小的数的个数。
把这些结果统计起来即可。
四.程序代码
#include
ints[10];//记录0~9出现的次数
inta[10];//a[i]记录n位数的规律
voidsum(intn,intl,intm)
{
if(m==1)
{intzero=1;
for(inti=0;i<=l;i++)//去除前缀0{
s[0]-=zero;
zero*=10;
}}
if(n<10)
{
for(inti=0;i<=n;i++)
{
s[i]+=1;
}
return;
}//位数为1位时,出现次数加1
//位数大于1时的出现次数
for(intt=1;t<=l;t++)//计算规律f(n)=n*10^(n-1){m=1;inti;for(i=1;ifor(inti=0;i{
zero*=10;
}//求出输入数为10的n次方
intyushu=n%zero;//求出最高位以后的数
intzuigao=n/zero;//求出最高位zuigao
for(i=0;i{
s[i]+=zero;
}//求出0~zuigao-1位的数的出现次数
for(i=0;i<10;i++)
{
s[i]+=zuigao*a[l];
}//求出与余数位数相同的0~zuigao-1位中0~9出现的次数
//如果余数是0,则程序可结束,不为0则补上所缺的0数,和最高位对应所缺的数
if(yushu==0)//补上所缺的0数,并且最高位加1
{
s[zuigao]++;
s[0]+=l;
}
else
{
i=0;
while((zero/=10)>yushu)
{
i++;
}
s[0]+=i*(yushu+1);//补回因作模操作丢失的0
s[zuigao]+=(yushu+1);//补回最高位丢失的数目
sum(yushu,l-i-1,m+1);//处理余位数}}voidmain(){
inti,m,n,N,l;
cout<<"输入数字要查询的数字:
";cin>>N;cout<<'\n';n=N;
for(i=0;n>=10;i++)
{
n/=10;
}//求出N的位数n-1
l=i;
sum(N,l,1);
for(i=0;i<10;i++)
{
cout<<"数字"<
"<
}
}
五.程序调试中的问题
调试过程中总是有这样那样的问题,通过一步步的修改,最终得以实现。
六.实验结果
算法设计与分析实验报告二
实验名称分治法实现归并排序算法评分实验日期年月日指导教师刘长松姓名刘飞初专业班级计算机0901学号10
一.实验要求
1.了解用分治法求解的问题:
当要求解一个输入规模为n,且n的取值相当大的问题时,如果问题可以分成k个不同子集合,得到k个不同的可独立求解的子问题,其中1那末,对于这类问题分治法是十分有效的。
2.掌握分治法的一般控制流程。
DanC(p,q)
globaln,A[1:
n];integerm,p,q;//1?
p?
q?
n
ifSmall(p,q)thenreturnG(p,q);
elsem=Divide(p,q);//p?
mreturnCombine(DanC(p,m),DanC(m+1,q));
endif
endDanC
3.实现典型的分治算法的编程与上机实验,验证算法的时间复杂性函数。
二.实验内容
1.编程实现归并排序算法,程序中加入比较次数的计数功能,输出排序结果和比较次数。
2.输入10组相同的数据,验证排序结果和完成排序的比较次数。
3.与复杂性函数所计算的比较次数比较。
4.用表格列出比较结果。
5.给出文字分析。
三.程序算法
1.归并排序算法
procedureMERGESORT(low,high)
//A(low;high)是一个全程数组,它含
有high-low+1≥0个待排序的元素//
integerlow,high;
iflowthenmid←,//求这个集合的分割点//
callMERGESORT(low,mid)//将一个子集合排序//
callMERGESORT(mid+1,high)//将另一个子集合排序callMERGE(low,mid,high)//归并两个已排序的子集合//endif
endMERGESORT
归并两个已排序的集合
procedureMERGE(low,mid,high)
//A(low:
high)是一个全程数组//
//辅助数组B(low;high)//
integerh,i,j,k;
h←low;i←low;j←mid+1;
whileh≤midandj≤highdo//当两个集合都没取尽时//ifA(h)≤A(j)thenB(i)←A(h);h←h+1
elseB(i)←A(j);j←j+1
endif
i←i+1
repeat
ifh>midthen
fork←jtohighdo//处理剩余的元素//
B(i)←A(k);i←i+1
repeat
elsefork←htomiddo
B(i)←A(k);i←i+1
repeat
endif
将已归并的集合复制到A
endMERGE
2.快速排序算法
QuickSort(p,q)
//将数组A[1:
n]中的元素
A[p],A[p+1],?
A[q]按不降次序排列,
并假定A[n+1]是一个确定的、且大于
A[1:
n]中所有的数。
//
intp,q;globaln,A[1:
n];
ifpj=Partition(p,q+1);//划分后j成为划分元素的位置QuickSort(p,j-1);
QuickSort(j+1,q);
endif
endQuickSort
procedurePARTITION(m,p)
//退出过程时,p带着划分元素所在的下标位置。
//
integerm,p,i;globalA(m:
p-1)
v←A(m);i←m//A(m)是划分元素//
loop
loopi←i+1untilA(i)≥vrepeat//i由左向右移//loopp←p-1untilA(p)≤vrepeat//p由右向左移//ifi
thencallINTERCHANGE(A(i),A(p))//A(i)和A(p)换位//elseexit
endif
repeat
A(m)←A(p);A(p)←v//划分元素在位置p//
EndPARTITION
四.程序代码
归并排序
#include
#include
#include
#include
#defineM11
typedefintKeyType;
typedefintElemType;
structrec{
KeyTypekey;
ElemTypedata;
};
typedefrecsqlist[M];
classguibing{
public:
guibing(sqlistb)
{
}for(inti=0;i{}voidxuanze(sqlistb,intm,intn){}voidmerge(intl,intm,inth,sqlistr2){xuanze(r,l,m);xuanze(r,m,h);output(r,M);inti,j,k;k=i=l;for(j=m;ib[j].key)k=j;if(k!
=i){}rectemp=b[k];b[k]=b[i];b[i]=temp;for(inti=0;i}}}j++;output(r2,M);while(jprivate:
sqlistr;
};
voidmain()
{
cout<<"guibingfa1运行结果:
\n";sqlista,b;inti,j=0,k=M/2,n=M;srand(time(0));for(i=0;i\n";gx.output(a,M);cout<<"数组排序过程演示:
\n";gx.merge(j,k,n,b);cout<<"排序后数组:
\n";a[i].key=rand()%80;b[i].key=0;
}cin.get();
快速排序
#include#include
#include
#include
#defineMAXI10
typedefintKeyType;typedefintElemType;structrec{
KeyTypekey;
ElemTypedata;
};
typedefrecsqlist[MAXI];classkuaisu
{
public:
kuaisu(sqlista,intm):
n(m){
}
voidquicksort(ints,intt){
}
intpart(ints,intt){
inti,j;recp;i=s;j=t;p=b[s];inti;if(s}while(i=p.key)j--;b[i]=b[j];while(ivoidoutput()
{
}
private:
sqlistb;
intn;
};
voidmain()
{
cout<<"kuaisu1.cpp运行结果:
\n";
sqlista1;
inti,n=MAXI,low=0,high=9;
srand(time(0));
for(i=0;ia1[i].key=rand()%80;
kuaisupx(a1,n);
cout<<"数组排序过程演示:
\n";
px.quicksort(low,high);
cout<<"排序后数组:
\n";
px.output();
cin.get();
}for(inti=0;i五.程序调试中的问题
1.归并排序
2.快速排序
算法设计与分析实验报告三
实验名称动态规划算法实现多段图的最短路径问题评分实验日期年月日指导教师刘长松姓名刘飞初专业班级计算机0901学号10
一.实验要求
1.理解最优子结构的问题。
有一类问题的活动过程可以分成若干个阶段,而且在任一阶段后的行为依赖于该阶段的状态,与该阶段之前的过程如何达到这种状态的方式无关。
这类问题的解决是多阶段的决策过程。
在50年代,贝尔曼(RichardBellman)等人提出了解决这类问题的“最优化原理”,从而创建了最优化问题的一种新的算法设计方法-动态规划。
对于一个多阶段过程问题,是否可以分段实现最优决策,依赖于该问题是否有最优子结构性质,能否采用动态规划的方法,还要看该问题的子问题是否具有重叠性质。
最优子结构性质:
原问题的最优解包含了其子问题的最优解。
子问题重叠性质:
每次产生的子问题并不总是新问题,有些子问题被反复计算多次。
问题的最优子结构性质和子问题重叠性质是采用动态规划算法的两个基本要素。
2.理解分段决策Bellman方程。
每一点最优都是上一点最优加上这段长度。
即当前最优只与上一步有关。
?
?
us?
0,?
u?
min{u?
w}.iij?
ji?
j?
Us初始值,uj第j段的最优值。
3.一般方法
1)找出最优解的性质,并刻画其结构特征;
2)递归地定义最优值(写出动态规划方程);
3)以自底向上的方式计算出最优值;
4)根据计算最优值时得到的信息,构造一个最优解。
步骤1-3是动态规划算法的基本步骤。
在只需要求出最优值的情形,步骤4可以省略,步骤3中记录的信息也较少;若需要求出问题的一个最优解,则必须执行步骤4,步骤3中记录的信息必须足够多以便构造最优解。
二.实验内容
1.编程实现多段图的最短路径问题的动态规划算法。
2.图的数据结构采用邻接表。
3.要求用文件装入5个多段图数据,编写从文件到邻接表的函数。
4.验证算法的时间复杂性。
三.程序算法
多段图算法
procedureFGRAPH(E,k,n,P)
//输入是按段的顺序给结点编号的,有n个结点
的k段图。
E是边集,c(i,j)是边的成本。
P(1:
k)是最小成本路径。
//
realCOST(n),integerD(n一1),P(k),r,j,k,n
COST(n)←0
forj←n-1to1by-1do//计算COST(j)//
设r是一个这样的结点,(j,r)?
E且使c(j,r)+COST(r)取最小值COST(j)←c(j,r)+COST(r)
D(j)←r
repeat//向前对j-1进行决策//
P
(1)←1;P(k)←n;
forj←2tok-1do//找路径上的第j个节点//
P(j)←D(P(j-1))
repeat
endFGRAPH
四.程序代码
多段图问题
#include
#include
#include
#defineMAX_VERTEX_NUM50
typedefstructArcNode
{
intadjvex;//该弧所指向的顶点的位置
intvalue;//该结点与邻接结点间的代价
structArcNode*nextarc;//指向下一条弧的指针
}ArcNode,*node;
typedefstructVNode
{
intdata;//顶点信息
ArcNode*firstArc;//指向第一条依附该顶点的弧的指针}VNode,AdjList[MAX_VERTEX_NUM];
typedefstructGraph
{
AdjListvertices;
intvexnum,arcnum;//图的当前顶点数和弧数}*ALGraph;
intbuild_adList(ALGraphG,intn,inta){//建立邻接表
intv,m,i,t,h;
nodep,q;
if(n<0)returnprintf("ERROR");G->vexnum=n;//图的顶点数
if(a<0)returnprintf("ERROR");G->arcnum=a;//图的弧数
for(m=0;m{
}
for(m=1;m<=a;m++)
{
}
returnv;i=1;printf("输入第%d条弧:
",m);scanf("%d,%d,%d",&t,&h,&v);p=(ArcNode*)malloc(sizeof(ArcNode));p->adjvex=h;p->value=v;p->nextarc=NULL;while(G->vertices[i].data!
=t)i++;//转到下一个结点if(!
G->vertices[i].firstArc)//终点G->vertices[i].firstArc=p;else{//若当前结点有后继节点则后移}for(q=G->vertices[i].firstArc;q->nextarc;q=q->nextarc);q->nextarc=p;//新开辟结点G->vertices[m].data=m;G->vertices[m].firstArc=NULL;
voidprint_Graph(ALGraphG)
{//打印邻接表
ArcNode*p=(ArcNode*)malloc(sizeof(ArcNode));
inti;
for(i=1;ivexnum;i++)
{
}
}
voidfgraph(ALGraphG,intk,intn)
{//多段图ALGraphG,n为结点数,k为图的段数
//输入是按段的顺序给结点编号
intcost[100];
intd[100];
intpath[100];
intj,r,i,min,w,value;
nodep;
cost[n]=0;
for(j=n-1;j>=1;j--)//向前处理结点
{
p=G->vertices[j].firstArc;min=p->value+cost[p->adjvex];//初始化路径最小代价r=p->adjvex;value=p->value;while(p!
=NULL){//r是一个的这样的结点,权值c(j,r)+cost[r]取最小值if((p->value+cost[p->adjvex])value+cost[p->adjvex];//p->value=c(j,r)p=G->vertices[i].firstArc;printf("[%d]",i);while(p){}printf("\n");printf("->%d,%d",p->adjvex,p->value);//第i个结点的邻接结点信息p=p->nextarc;
}}}value=p->value;p=p->nextarc;cost[j]=value+cost[r];//当前节点的代价值d[j]=r;//决策阶段,各结点到终点最小代价路径上前方顶点的编号
path[1]=1;path[k]=n;
for(i=2;i<=k-1;i++)//找出最小代价路径上的结点
path[i]=d[path[i-1]];
printf("最小成本为:
%d\n",cost[1]);
printf("最小成本路径为:
");
for(w=1;w<=k;w++)
}
voidmain()
{
ALGraphg;
intn,a,k;
g=(ALGraph)malloc(sizeof(ALGraph));
printf("请输入多段图节点数目:
");
scanf("%d",&n);
printf("请输入多段图边的数目:
");
scanf("%d",&a);
printf("请输入多段图的段数:
");
scanf("%d",&k);
printf("输入多段图的弧的信息(弧头,弧尾,权值)\n");
build_adList(g,n,a);
printf("多段图的邻接表为:
\n");
print_Graph(g);
fgraph(g,k,n);
getch();
}printf("%d->",path[w]);
五.实验结果
多段图问题
算法设计与分析实验报告四
实验名称贪心算法实现背包问题评分实验日期年月日指导教师刘长松姓名刘飞初专业班级计算机0901学号10
一.实验要求
1.优化问题
有n个输入,而它的解就由这n个输入满足某些事先给定的约束条件的某个子集组成,而把满足约束条件的子集称为该问题的可行解。
可行解一般来说是不唯一的。
那些使目标函数取极值(极大或极小)的可行解,称为最优解。
2.贪心法求优化问题
算法思想:
在贪心算法中采用逐步构造最优解的方法。
在每个阶段,都作出一个看上去最优的决策(在一定的标准下)。
决策一旦作出,就不可再更改。
作出贪心决策的依据称为贪心准则(greedycriterion)。
3.一般方法
1)根据题意,选取一种量度标准。
2)按这种量度标准对这n个输入排序
3)依次选