算法设计与分析实验报告文档格式.docx
- 文档编号:19612148
- 上传时间:2023-01-08
- 格式:DOCX
- 页数:37
- 大小:116.31KB
算法设计与分析实验报告文档格式.docx
《算法设计与分析实验报告文档格式.docx》由会员分享,可在线阅读,更多相关《算法设计与分析实验报告文档格式.docx(37页珍藏版)》请在冰豆网上搜索。
k≤n,而且子问题与原问题性质相同,原问题的解可由这些子问题的解合并得出。
那末,对于这类问题分治法是十分有效的。
2.掌握分治法的一般控制流程。
DanC(p,q)
globaln,A[1:
n];
integerm,p,q;
//1pqn
ifSmall(p,q)thenreturnG(p,q);
elsem=Divide(p,q);
//pm<
q
returnCombine(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;
iflow<
high;
thenmid←,//求这个集合的分割点//
callMERGESORT(low,mid)//将一个子集合排序//
callMERGESORT(mid+1,high)//将另一个子集合排序
callMERGE(low,mid,high)//归并两个已排序的子集合//
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
i←i+1
repeat
ifh>
midthen
fork←jtohighdo//处理剩余的元素//
B(i)←A(k);
i←i+1
elsefork←htomiddo
将已归并的集合复制到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:
ifp<
qthen
j=Partition(p,q+1);
//划分后j成为划分元素的位置
QuickSort(p,j-1);
QuickSort(j+1,q);
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<
p
thencallINTERCHANGE(A(i),A(p))//A(i)和A(p)换位//
elseexit
A(m)←A(p);
A(p)←v//划分元素在位置p//
EndPARTITION
四.程序代码
1.归并排序
#include<
iostream.h>
iomanip.h>
stdlib.h>
time.h>
#defineM11
typedefintKeyType;
typedefintElemType;
structrec{
KeyTypekey;
ElemTypedata;
};
typedefrecsqlist[M];
classguibing{
public:
guibing(sqlistb)
{
for(inti=0;
i<
M;
i++)
r[i]=b[i];
}
voidoutput(sqlistr,intn)
{
for(inti=0;
n;
cout<
<
setw(4)<
r[i].key;
cout<
endl;
}
voidxuanze(sqlistb,intm,intn)
inti,j,k;
for(i=m;
n-1;
{
k=i;
for(j=i;
j<
j++)
if(b[k].key>
b[j].key)k=j;
if(k!
=i)
{
rectemp=b[k];
b[k]=b[i];
b[i]=temp;
}
}
voidmerge(intl,intm,inth,sqlistr2)
xuanze(r,l,m);
xuanze(r,m,h);
output(r,M);
k=i=l;
for(j=m;
m&
&
h;
k++)
if(r[i].key<
=r[j].key)
{
r2[k]=r[i];
i++;
}
else
r2[k]=r[j];
j++;
output(r2,M);
while(j<
h)
r2[k]=r[j];
j++;
k++;
while(i<
=m)
r2[k]=r[i];
i++;
output(r2,M);
private:
sqlistr;
};
voidmain()
cout<
"
guibingfa1运行结果:
\n"
;
sqlista,b;
inti,j=0,k=M/2,n=M;
srand(time(0));
for(i=0;
a[i].key=rand()%80;
b[i].key=0;
guibinggx(a);
排序前数组:
gx.output(a,M);
数组排序过程演示:
gx.merge(j,k,n,b);
排序后数组:
gx.output(b,M);
cin.get();
2.快速排序
#defineMAXI10
typedefrecsqlist[MAXI];
classkuaisu
{
kuaisu(sqlista,intm):
n(m)
i++)b[i]=a[i];
voidquicksort(ints,intt)
inti;
if(s<
t){
i=part(s,t);
quicksort(s,i-1);
quicksort(i+1,t);
elsereturn;
intpart(ints,intt)
inti,j;
recp;
i=s;
j=t;
p=b[s];
while(i<
j)
j&
b[j].key>
=p.key)j--;
b[i]=b[j];
b[i].key<
=p.key)i++;
b[j]=b[i];
b[i]=p;
output();
returni;
voidoutput()
b[i].key;
sqlistb;
intn;
voidmain()
cout<
kuaisu1.cpp运行结果:
sqlista1;
inti,n=MAXI,low=0,high=9;
srand(time(0));
for(i=0;
a1[i].key=rand()%80;
kuaisupx(a1,n);
px.quicksort(low,high);
px.output();
cin.get();
}
五.实验结果
实验二贪心法
1.优化问题
有n个输入,而它的解就由这n个输入满足某些事先给定的约束条件的某个子集组
成,而把满足约束条件的子集称为该问题的可行解。
可行解一般来说是不唯一的。
那些使目标函数取极值(极大或极小)的可行解,称为最优解。
2.贪心法求优化问题
算法思想:
在贪心算法中采用逐步构造最优解的方法。
在每个阶段,都作出一个看上去最优的决策(在一定的标准下)。
决策一旦作出,就不可再更改。
作出贪心决策的依据称为贪心准则(greedycriterion)。
3.一般方法
1)根据题意,选取一种量度标准。
2)按这种量度标准对这n个输入排序
3)依次选择输入量加入部分解中。
如果当前这个输入量的加入,不满足约束条件,则不把此输入加到这部分解中。
procedureGREEDY(A,n)/*贪心法一般控制流程*/
//A(1:
n)包含n个输入//
solutions←φ//将解向量solution初始化为空/
fori←1tondo
x←SELECT(A)
ifFEASIBLE(solution,x)
thensolutions←UNION(solution,x)
return(solution)
endGREEDY
4.实现典型的贪心算法的编程与上机实验,验证算法的时间复杂性函数。
1.编程实现背包问题贪心算法和最小生成树prim算法。
通过具体算法理解如何通过局部最优实现全局最优,并验证算法的时间复杂性。
2.输入5个的图的邻接矩阵,程序加入统计prim算法访问图的节点数和边数的语句。
3.将统计数与复杂性函数所计算的比较次数比较,用表格列出比较结果,给出文字分析。
1.背包问题的贪心算法
procedureKNAPSACK(P,W,M,X,n)
//P(1:
n)和W(1;
n)分别含有按
P(i)/W(i)≥P(i+1)/W(i+1)排序的n件物品的效益值
和重量。
M是背包的容量大小,而x(1:
n)是解向量
realP(1:
n),W(1:
n),X(1:
n),M,cu;
integeri,n;
X←0//将解向量初始化为零
cu←M//cu是背包剩余容量
ifW(i)>
cuthenexitendif
X(i)←1
cu←cu-W(i)
ifi≤nthenX(i)←cu/W(i)
endGREEDY-KNAPSACK
procedureprim(G,)
status←“unseen”//T为空
status[1]←“treenode”//将1放入T
foreachedge(1,w)do
status[w]←“fringe”//找到T的邻接点
dad[w]←1;
//w通过1与T建立联系
dist[w]←weight(1,w)//w到T的距离
whilestatus[t]≠“treenode”do
pickafringeuwithmindist[w]//选取到T最近的节点
status[u]←“treenode”
foreachedge(u,w)do
修改w和T的关系
repeat
2.Prim算法
PrimMST(G,T,r){
//求图G的以r为根的MST,结果放在T=(U,TE)中
InitCandidateSet(…);
//初始化:
设置初始的轻边候选集,并置T=({r},¢)
for(k=0;
k<
n-1;
k++){//求T的n-1条树边
(u,v)=SelectLiShtEdge(…);
//选取轻边(u,v);
T←T∪{(u,v)};
//扩充T,即(u,v)涂红加入TE,蓝点v并人红点集U
ModifyCandidateSet(…);
//根据新红点v调整候选轻边集
}
1.背包问题贪心算法
#include<
structgoodinfo
floatp;
//物品效益
floatw;
//物品重量
floatX;
//物品该放的数量
intflag;
//物品编号
//物品信息结构体
voidInsertionsort(goodinfogoods[],intn)
intj,i;
for(j=2;
=n;
goods[0]=goods[j];
i=j-1;
while(goods[0].p>
goods[i].p)
goods[i+1]=goods[i];
i--;
goods[i+1]=goods[0];
}//按物品效益,重量比值做升序排列
voidbag(goodinfogoods[],floatM,intn)
{
floatcu;
inti,j;
for(i=1;
goods[i].X=0;
cu=M;
//背包剩余容量
if(goods[i].w>
cu)//当该物品重量大与剩余容量跳出
break;
goods[i].X=1;
cu=cu-goods[i].w;
//确定背包新的剩余容量
if(i<
=n)
goods[i].X=cu/goods[i].w;
//该物品所要放的量
for(j=2;
while(goods[0].flag<
goods[i].flag)
cout<
最优解为:
第"
件物品要放:
goods[i].X<
|--------运用贪心法解背包问题---------|"
|-------------------------------------|"
intj;
floatM;
goodinfo*goods;
//定义一个指针
while(j)
请输入物品的总数量:
cin>
>
goods=newstructgoodinfo[n+1];
请输入背包的最大容量:
inti;
{goods[i].flag=i;
请输入第"
件物品的重量:
goods[i].w;
件物品的效益:
goods[i].p;
goods[i].p=goods[i].p/goods[i].w;
//得出物品的效益,重量比
Insertionsort(goods,n);
bag(goods,M,n);
press<
1>
torunagian"
0>
toexit"
j;
stdio.h>
#defineINFINITYINT_MAX
#defineMAX_VERTEX_NUM20
typedefintVRType;
typedefintInfoType;
typedefcharVerTexType;
typedefstructArcCell
VRTypeadj;
InfoType*info;
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedefstruct
VerTexTypevexs[MAX_VERTEX_NUM];
AdjMatrixarcs;
intvexnum,arcnum;
}MGraph;
VerTexTypeadjvex;
VRTypelowcost;
}closedge[MAX_VERTEX_NUM];
voidCreateGraph(MGraph&
G);
voidMiniSpanTree_PRIM(MGraphG,VerTexTypeu);
intLocateVex(MGraphG,VerTexTypeu);
intminimum(closedgeclose);
voidmain(void)
inti,j;
MGraphG;
CreateGraph(G);
for(i=0;
i<
G.vexnum;
i+
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 设计 分析 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)