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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

考研数据结构图的必背算法及知识点.docx

1、考研数据结构图的必背算法及知识点1.最小生成树:无向连通图的所有生成树中有一棵边的权值总和最小的生成树1.1 问题背景:假设要在n个城市之间建立通信联络网,则连通n个城市只需要n1条线路。这时,自然会考虑这样一个问题,如何在最节省经费的前提下建立这个通信网。在每两个城市之间都可以设置一条线路,相应地都要付出一定的经济代价。n个城市之间,最多可能设置n(n-1)/2条线路,那么,如何在这些可能的线路中选择n-1条,以使总的耗费最少呢?1.2 分析问题(建立模型):可以用连通网来表示n个城市以及n个城市间可能设置的通信线路,其中网的顶点表示城市,边表示两城市之间的线路,赋于边的权值表示相应的代价。

2、对于n个顶点的连通网可以建立许多不同的生成树,每一棵生成树都可以是一个通信网。即无向连通图的生成树不是唯一的。连通图的一次遍历所经过的边的集合及图中所有顶点的集合就构成了该图的一棵生成树,对连通图的不同遍历,就可能得到不同的生成树。图 G5无向连通图的生成树 为(a)、(b)和(c)图所示:G5G5的三棵生成树:可以证明,对于有n 个顶点的无向连通图,无论其生成树的形态如何,所有生成树中都有且仅有n1 条边。1.3最小生成树的定义:如果无向连通图是一个网,那么,它的所有生成树中必有一棵边的权值总和最小的生成树,我们称这棵生成树为最小生成树,简称为最小生成树。最小生成树的性质:假设N=(V, E

3、) 是个连通网,U是顶点集合V的一个非空子集,若(u,v)是个一条具有最小权值(代价)的边,其中,则必存在一棵包含边(u,v)的最小生成树。1.4 解决方案:两种常用的构造最小生成树的算法:普里姆(Prim)和克鲁斯卡尔(Kruskal)。他们都利用了最小生成树的性质1.普里姆(Prim)算法:有线到点,适合边稠密。时间复杂度O(N2)假设G(V,E)为连通图,其中V 为网图中所有顶点的集合,E 为网图中所有带权边的集合。设置两个新的集合U 和T,其中集合U(顶点集) 用于存放G 的最小生成树中的顶点,集合T (边集合)存放G 的最小生成树中的边。T ,U的初始状态:令集合U 的初值为Uu1(

4、假设构造最小生成树时,从顶点u1 出发),集合T 的初值为T。Prim 算法的思想是:从所有uU,vVU 的边中,选取具有最小权值的边(u,v)E,将顶点v 加入集合U 中,将边(u,v)加入集合T 中,如此不断重复,直到UV 时,最小生成树构造完毕,这时集合T 中包含了最小生成树的所有边。Prim 算法可用下述过程描述,其中用wuv 表示顶点u 与顶点v 边上的权值。(1)Uu1,T=;(2)while (UV)do(u,v)minwuv;uU,vVU TT(u,v)UUv(3)结束。按照Prim 方法,从顶点1 出发,该网的最小生成树的产生过程如图:为实现Prim 算法,需设置两个辅助cl

5、osedge,用来保存U到集合VU 的各个顶点中具有最小权值的边的权值。对每个Vi(V-U )在辅助数组中存在一个相应的分量closedgei-1,它包括两个域:typedef struct ArcNodeint adjvex; /adjex域存储该边依附的在U中的顶点VrType lowcost; /lowcost域存储该边上的权重closedgeMAX_VERTEX_NUM;显然:初始状态时,Uv1(u1 为出发的顶点),则到V-U 中各项中最小的边,即依附顶点v1的各条边中,找到一条代价最小的边(u0,v0)= (1,3)为生成树上一条边。同时将v0(=v3)并入集合U中。然后修改辅助数

6、组的值。1)将closedge2.lowcost = 0;/表示顶点V3三已经并入U2) 由于边(v2,v3)的权值小于closedge1.lowcost,故需修改closedge1为边(v2,v3)及其权值,同理修改closedge4,closedge5.closedge1.adjvex = 3.closedge1.lowcost = 5.closedge4.adjvex = 1.closedge4.lowcost = 5.closedge5.adjvex = 3.closedge5.lowcost = 6.以此类推,直至U = V;下图给出了在用上述算法构造网图7.16的最小生成树的过程中

7、:Prim 算法实现:按照算法框架:(1)Uu1,T=;(2)while (UV)do(u,v)minwuv;uU,vVU TT(u,v)UUv(3)结束。当无向网采用二维数组存储的邻接矩阵存储时,Prim 算法的C 语言实现为:?1234567891011121314151617181920/记录从顶点集U到VU的代价最小的边的辅助数组定义: / struct / VertexType adjvex; / VRType lowcost; / closedge MAX_VERTEX_NUM void MiniSpanTree_PRIM (MGraph G,VertexType u) /用普里姆

8、算法从第u个顶点出发构造网G的最小生成树T,输出T的各条边。 k =LocateVex(G,u); for(j=0; jG.vexnum; +j) if(j!=k) closedgej =u ,G.arcskj.adj; / adjvex , lowcost closedgek.lowcost =0; /初始,U=u for( i=1;iG.vexnum;+i) /选择其余G.vexnum-1个顶点 k=minimum(closedge); printf(closedgek.adjvex, G.vexsk);/输出生成树的边 /第k顶点并入U集 closedgek.lowcost=0; for

9、(j=0; jG.vexnum; +j) if (G.acrskj.adjclosedgej.lowcost) closedgej=G.vexsk,G.arcskj.adj; /for /MiniSpanTree 假设网中有n个顶点,则第一个进行初始化的循环语句的频度为n,第二个循环语句的频度为n-1。其中有两个内循环:其一是在closedgev.lowcost中求最小值,其频度为n-1;其二是重新选择具有最小代价的边,其频度为n。 由此,普里姆算法的时间复杂度为O(n2),与网中的边数无关,因此适用于求边稠密的网的最小生成树。2.克鲁斯卡尔(Kruskal) :由点到线,适合边稀疏的网。时间

10、复杂度:O(e * loge)Kruskal 算法是一种按照网中边的权值递增的顺序构造最小生成树的方法。基本思想是:1) 设无向连通网为G(V,E),令G 的最小生成树为T,其初态为T(V,),即开始时,最小生成树T 由图G 中的n 个顶点构成,顶点之间没有一条边,这样T 中各顶点各自构成一个连通分量。2) 在E中选择代价最小的边,若该边依附的顶点落在T中不同的连通分量,则将此边加入到T中,否则舍弃此边而选择下一条边(若该边依附的两个顶点属于同一个连通分量,则舍去此边,以免造成回路)。依此类推,当T 中的连通分量个数为1 时,此连通分量便为G 的一棵最小生成树。按照Kruskal 方法构造最小

11、生成树的过程如图所示:在构造过程中,按照网中边的权值由小到大的顺序,不断选取当前未被选取的边集中权值最小的边。依据生成树的概念,n 个结点的生成树,有n1 条边,故反复上述过程,直到选取了n1 条边为止,就构成了一棵最小生成树。Kruskal 算法的实现:算法的框架:构造非连通图T(V,)k = i= 0;/k为边数while(k n-1) i+;检查边E中第i条边的权值最小边(u,v)若(u,v) 加入T不是T产生回路,则(u,v)加入T,且k+c语言实现:C 语言实现Kruskal 算法,其中函数Find 的作用是寻找图中顶点所在树的根结点在数组father 中的序号。需说明的是,在程序中

12、将顶点的数据类型定义成整型,而在实际应用中,可依据实际需要来设定。?123456789101112131415161718192021222324252627282930313233typedef int elemtype; typedef struct elemtype v1; elemtype v2; int cost; EdgeType; void Kruskal(EdgeType edges ,int n) /*用Kruskal 方法构造有n 个顶点的图edges 的最小生成树*/ int fatherMAXEDGE; int i,j,vf1,vf2; for (i=0;in;i+)

13、fatheri=-1; i=0;j=0; while(iMAXEDGE & j=0) t=fathert; return(t); 2. AOV网与拓扑排序:由偏序定义得到拓扑有序的操作便是拓扑排序。建立模型是AOV网2. 1AOV网(Activity on vertex network)所有的工程或者某种流程可以分为若干个小的工程或阶段,这些小的工程或阶段就称为活动。若以图中的顶点来表示活动,有向边(弧)表示活动之间的优先关系,则这样活动在顶点上的有向图称为AOV 网(Activity On Vertex Network)。在AOV 网中,若从顶点i到顶点j之间存在一条有向路径,称顶点i是顶点j的前驱,或者称顶点j 是顶点i的后继。若是图中的弧,则称顶点i是顶点j 的直接前驱,顶点j 是顶点i 的直接后驱。AOV 网中的弧表示了活动之间存在的制约关系。例如,计算机专业的学生必须完成一系列规定的基础课和专业课才能毕业。学生按照怎样的顺序来学习这些课程呢?这个问题可以被看成是一个大的工程,其活动就是学习每一门课程。这些课程的名称与相应代号如表所示。课程之间的优先关系图:该图的拓扑有序系列:注意:在AOV

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

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