ImageVerifierCode 换一换
格式:DOCX , 页数:17 ,大小:84.10KB ,
资源ID:3658625      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/3658625.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(算法设计与分析实验四.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

算法设计与分析实验四.docx

1、算法设计与分析实验四实验四:贪心法一、实验目的 1、掌握贪心算法的基本设计思想与原则 2、运用贪心法求解经典问题(验证性实验)二、实验原理 1、优化问题 有n个输入,而它的解就由这n个输入满足某些事先给定的约束条件的某个子集组成,而把满足约束条件的子集称为该问题的可行解。可行解一般来说是不唯一的。那些使目标函数取极值(极大或极小)的可行解,称为最优解。 2、贪心法求优化问题 算法思想:在贪心算法中采用逐步构造最优解的方法。在每个阶段,都作出一个看上去最优的决策(在一定的标准下)。决策一旦作出,就不可再更改。作出贪心决策的依据称为贪心准则(greedy criterion)。 3、一般方法1)根

2、据题意,选取一种量度标准。2)按这种量度标准对这n个输入排序3)依次选择输入量加入部分解中。如果当前这个输入量的加入,不满足约束条件,则不把此输入加到这部分解中。procedure GREEDY(A,n) /*贪心法一般控制流程*/ /A(1:n)包含n个输入/ solutions /将解向量solution初始化为空 for i1 to n do xSELECT(A) if FEASIBLE(solution,x) then solutionsUNION(solution,x) endif repeat return(solution)end GREEDY三、实验要求 1、用C+/C完成算法

3、设计和程序设计并上机调试通过。 2、撰写实验报告,提供实验结果和数据。 3、分析算法,要求给出具体的算法分析结果,包括时间复杂度和空间复杂度,并简要给出算法设计小结和心得。四、实验内容 1、哈夫曼编码 设需要编码的字符集为d1, d2, , dn,它们出现的频率为w1, w2, , wn,应用哈夫曼树构造最短的不等长编码方案。 设需要编码的字符集为d1, d2, , dn,它们出现的频率为w1, w2, , wn,以d1, d2, , dn作为叶子结点,w1, w2, , wn作为叶子结点的权值,构造一棵哈夫曼编码树,规定哈夫曼编码树的左分支代表0,右分支代表1,则从根结点到每个叶子结点所经过

4、的路径组成的0和1的序列便为该叶子结点对应字符的编码即为哈夫曼编码。考虑到哈夫曼树中共有2n-1个结点,并且进行n-1次合并操作,为了便于选取根结点权值最小的二叉树以及合并操作,设置一个数组huffTree2n-1保存哈夫曼树中各结点的信息,数组元素的结点结构如下图所示。将数组元素的结点类型定义为:struct element double weight; /字符出现的概率为实数 int lchild, rchild, parent; 建立哈夫曼树的算法如下:Select函数用来在数组huffTree中选取两个权值最小的根结点,请读者自行完成。根据已建立的哈夫曼树,规定哈夫曼树的左分支代表0,

5、右分支代表1,则哈夫曼编码即是从根结点到每个叶子结点所经过的路径组成的0和1的序列。算法如下: 2、背包问题 贪心算法: procedure KNAPSACK(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)是解向量 real P(1:n),W(1:n),X(1:n),M,cu; integer i,n;X0 /将解向量初始化为零 cuM /cu是背包剩余容量 for i1 to n do if W(i)cu then exit endif X(i) 1 cucu-W(i

6、) repeat if in then X(i) cu/ W(i) endif end GREEDY-KNAPSACKprocedure prim(G,)status“unseen” / T为空 status1“tree node” / 将1放入Tfor each edge(1,w) do statusw“fringe” / 找到T的邻接点 dadw 1; /w通过1与T建立联系 distw weight(1,w) /w到T的距离 repeatwhile statust “tree node” do pick a fringe u with min distw / 选取到T最近的节点 stat

7、usu“tree node” for each edge(u,w) do 修改w和T的关系 repeatrepeat 3、最小生成树的prim算法PrimMST(G,T,r) /求图G的以r为根的MST,结果放在T=(U,TE)中 InitCandidateSet();/初始化:设置初始的轻边候选集,并置T=(r,) for(k=0;ki(1,i之间存在边) or +无穷大(1.i之间不存在边) 2)在S中,令d(j)=mind(i),i属于S,令S=S-j,若S为空集则算法结束,否则转3) 3)对全部i属于S,如果存在边j-i,那么置d(i)=mind(i), d(j)+Wj-i,转2) D

8、ijkstra算法思想为:设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径 , 就将 加入到集合S中,直到全部顶点都加入到S中,算法就结束了),第二组为其余未确定最短路径的顶点集合(用U表示),按最短路径长度的递增次序依次把第二组的顶点加入S中。在加入的过程中,总保持从源点v到S中各顶点的最短路径长度不大于从源点v到U中任何顶点的最短路径长度。此外,每个顶点对应一个距离,S中的顶点的距离就是从v到此顶点的最短路径长度,U中的顶点的距离,是从v到此顶点只包括S中的顶点为中间顶点的当前最短路径长度

9、。 算法具体步骤: (1)初始时,S只包含源点,即S,v的距离为0。U包含除v外的其他顶点,U中顶点u距离为边上的权(若v与u有边)或 )(若u不是v的出边邻接点)。 (2)从U中选取一个距离v最小的顶点k,把k,加入S中(该选定的距离就是v到k的最短路径长度)。 (3)以k为新考虑的中间点,修改U中各顶点的距离;若从源点v到顶点u(u U)的距离(经过顶点k)比原来距离(不经过顶点k)短,则修改顶点u的距离值,修改后的距离值的顶点k的距离加上边上的权。 (4)重复步骤(2)和(3)直到所有顶点都包含在S中。 5、多机调度问题 要求给出一种作业调度方案,使所给的n个作业在尽可能短的时间内由m台

10、机器加工处理完成。约定,每个作业均可在任何一台机器上加工处理,但未完工前不允许中断处理。作业不能拆分成更小的子作业。 步骤:1)把作业按加工所用的时间从大到小排序 2)如果作业数目比机器的数目少或相等,则直接把作业分配下去 3)如果作业数目比机器的数目多,则每台机器上先分配一个作业,如下的作业分配时,是选那个表头上s最小的链表加入新作业。五、参考程序 2、背包问题贪心算法#include struct goodinfo float p; /物品效益 float w; /物品重量 float X; /物品该放的数量 int flag; /物品编号;/物品信息结构体void Insertionso

11、rt(goodinfo goods,int n) int j,i; for(j=2;jgoodsi.p) goodsi+1=goodsi; i-; goodsi+1=goods0; /按物品效益,重量比值做升序排列void bag(goodinfo goods,float M,int n) float cu; int i,j; for(i=1;i=n;i+) goodsi.X=0; cu=M; /背包剩余容量 for(i=1;icu)/当该物品重量大与剩余容量跳出 break; goodsi.X=1; cu=cu-goodsi.w;/确定背包新的剩余容量 if(i=n) goodsi.X=cu

12、/goodsi.w;/该物品所要放的量for(j=2;j=n;j+) goods0=goodsj; i=j-1; while (goods0.flaggoodsi.flag) goodsi+1=goodsi; i-; goodsi+1=goods0; cout最优解为:endl; for(i=1;i=n;i+) cout第i件物品要放:; coutgoodsi.Xendl; void main() cout|-运用贪心法解背包问题-|endl; cout|-|endl; int j; int n; float M; goodinfo *goods;/定义一个指针 while(j) coutn;

13、 goods=new struct goodinfo n+1;/ coutM; coutendl; int i; for(i=1;i=n;i+) goodsi.flag=i; cout请输入第igoodsi.w; cout请输入第igoodsi.p; goodsi.p=goodsi.p/goodsi.w;/得出物品的效益,重量比 coutendl; Insertionsort(goods,n); bag(goods,M,n); coutpress to run agianendl; coutpress to exitj; 3、最小生成树的prim算法#include #include #inc

14、lude #define INFINITY INT_MAX #define MAX_VERTEX_NUM 20 typedef int VRType;typedef int InfoType;typedef char VerTexType;typedef struct ArcCell VRType adj; InfoType *info; ArcCell, AdjMatrixMAX_VERTEX_NUMMAX_VERTEX_NUM;typedef struct VerTexType vexsMAX_VERTEX_NUM; AdjMatrix arcs; int vexnum, arcnum;

15、MGraph;typedef struct VerTexType adjvex; VRType lowcost;closedgeMAX_VERTEX_NUM;void CreateGraph(MGraph &G);void MiniSpanTree_PRIM(MGraph G, VerTexType u);int LocateVex(MGraph G, VerTexType u);int minimum(closedge close);void main( void ) int i, j; MGraph G; CreateGraph(G); for(i = 0; i G.vexnum; i+)

16、 for(j = 0; j G.vexnum; j+) coutG.arcsij.adj; cout ; coutendl; MiniSpanTree_PRIM(G, a);void CreateGraph(MGraph &G) int weigh; int i, j = 0, k = 0; char hand, tide; coutG.vexnumG.arcnum; for(i = 0; i G.vexnum; i+) for(j = 0; j G.vexnum; j+) G.arcsij.adj = 88; coutendl; coutinputG.vexnumchar for vexs:

17、; for(i=0; i G.vexsi; coutendl; coutinputG.arcnumarc(char,char,weigh):endl; j = 0; k = 0; for(i=0; i G.arcnum; i+) coutihand; cintide; cinweigh; while (hand != G.vexsj) j+; while (tide != G.vexsk) k+; G.arcsjk.adj = weigh; G.arcskj.adj = weigh; j = 0; k = 0; coutendl; void MiniSpanTree_PRIM(MGraph G

18、,VerTexType u) int i, j, k = 0; closedge close; k = LocateVex ( G, u ); for ( j = 0; j G.vexnum; j+ ) if (j != k) closej.adjvex = G.vexsk; closej.lowcost = G.arcskj.adj; closej.lowcost = 88; closej.adjvex = 0; closek.lowcost = 0; closek.adjvex = u; for (i = 1; i G.vexnum; i+) k = minimum(close); cou

19、tclosek.adjvex; cout; coutG.vexsk ; coutclosek.lowcostendl; closek.lowcost = 0; for (j=0; jG.vexnum; j+) if (G.arcskj.adj closej1.lowcost & closej1.lowcost != 0) client = closej1.lowcost; j2 = j1; j1+; return j2;4、最短路径问题 #include #include using namespace std; const int MaxNum=1000000; /边权最大值 int n;

20、/节点数目 int dist501; /到节点1的最短路径值 bool state501; /节点被搜索过状态指示 int data501501; /邻接矩阵 /查找权值最小的节点 int findmin() int minnode=0, min=MaxNum; for(int i=1; i=n; i+) if (disti n; for(int p=1; p=n; p+) for(int q=1; q datapq; if (datapq=0) datapq=MaxNum; /初始化 for(int i=1; i=n; i+) disti=data1i; state1=true; int d

21、one=1; while (donen) int node=findmin(); if (node!=0) done+; /找到的点的数目加1 statenode=true; /标记已经找到了从节点1到节点node的最短路径 for(int i=1; idistnode+datanodei) & (!statei) disti=distnode+datanodei; else break; for(int k=1; k=n; k+) if (distk=MaxNum) out-1; else outdistk; if (k=n) outendl; else out ; in.close();

22、out.close(); return 0; 5、多机调度问题typedef struct Job int ID;/作业号 int time;/作业所花费的时间Job;typedef struct JobNode /作业链表的节点 int ID; int time; JobNode *next;JobNode,*pJobNode;typedef struct Header /链表的表头 int s; pJobNode next;Header,pHeader;int SelectMin(Header* M,int m) int k=0; for(int i=1;im;i+) if(Mi.smk.s)k=i; return k;

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

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