考研数据结构图的必背算法及知识点Word格式文档下载.docx

上传人:b****4 文档编号:16037542 上传时间:2022-11-17 格式:DOCX 页数:21 大小:420.68KB
下载 相关 举报
考研数据结构图的必背算法及知识点Word格式文档下载.docx_第1页
第1页 / 共21页
考研数据结构图的必背算法及知识点Word格式文档下载.docx_第2页
第2页 / 共21页
考研数据结构图的必背算法及知识点Word格式文档下载.docx_第3页
第3页 / 共21页
考研数据结构图的必背算法及知识点Word格式文档下载.docx_第4页
第4页 / 共21页
考研数据结构图的必背算法及知识点Word格式文档下载.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

考研数据结构图的必背算法及知识点Word格式文档下载.docx

《考研数据结构图的必背算法及知识点Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《考研数据结构图的必背算法及知识点Word格式文档下载.docx(21页珍藏版)》请在冰豆网上搜索。

考研数据结构图的必背算法及知识点Word格式文档下载.docx

1.4解决方案:

两种常用的构造最小生成树的算法:

普里姆(Prim)和克鲁斯卡尔(Kruskal)。

他们都利用了最小生成树的性质

1.普里姆(Prim)算法:

有线到点,适合边稠密。

时间复杂度O(N^2)

假设G=(V,E)为连通图,其中V为网图中所有顶点的集合,E为网图中所有带权边的集合。

设置两个新的集合U和T,其中

集合U(顶点集)用于存放G的最小生成树中的顶点,

集合T(边集合)存放G的最小生成树中的边。

T,U的初始状态:

令集合U的初值为U={u1}(假设构造最小生成树时,从顶点u1出发),集合T的初值为T={}。

Prim算法的思想是:

从所有u∈U,v∈V-U的边中,选取具有最小权值的边(u,v)∈E,将顶点v加入集合U中,将边(u,v)加入集合T中,如此不断重复,直到U=V时,最小生成树构造完毕,这时集合T中包含了最小生成树的所有边。

Prim算法可用下述过程描述,其中用wuv表示顶点u与顶点v边上的权值。

(1)U={u1},T={};

(2)while(U≠V)do

(u,v)=min{wuv;

u∈U,v∈V-U}

T=T+{(u,v)}

U=U+{v}

(3)结束。

按照Prim方法,从顶点1出发,该网的最小生成树的产生过程如图:

为实现Prim算法,需设置两个辅助closedge,用来保存U到集合V-U的各个顶点中具有最小权值的边的权值。

对每个Vi∈(V-U)在辅助数组中存在一个相应的分量closedge[i-1],它包括两个域:

typedefstructArcNode

{

intadjvex;

//adjex域存储该边依附的在U中的顶点

VrTypelowcost;

//lowcost域存储该边上的权重

}closedge[MAX_VERTEX_NUM];

显然:

初始状态时,U={v1}(u1为出发的顶点),则到V-U中各项中最小的边,即依附顶点v1的各条边中,找到一条代价最小的边(u0,v0)=(1,3)为生成树上一条边。

同时将v0(=v3)并入集合U中。

然后修改辅助数组的值。

1)将closedge[2].lowcost=0;

//表示顶点V3三已经并入U

2)由于边(v2,v3)的权值小于closedge[1].lowcost,故需修改closedge[1]为边(v2,v3)及其权值,同理修改closedge[4],closedge[5].

closedge[1].adjvex=3.

closedge[1].lowcost=5.

closedge[4].adjvex=1.

closedge[4].lowcost=5.

closedge[5].adjvex=3.

closedge[5].lowcost=6.

以此类推,直至U=V;

下图给出了在用上述算法构造网图7.16的最小生成树的过程中:

Prim算法实现:

按照算法框架:

当无向网采用二维数组存储的邻接矩阵存储时,Prim算法的C语言实现为:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

//记录从顶点集U到V—U的代价最小的边的辅助数组定义:

 

//struct{

//VertexTypeadjvex;

//VRTypelowcost;

//}closedge[MAX_VERTEX_NUM]

voidMiniSpanTree_PRIM(MGraphG,VertexTypeu){

//用普里姆算法从第u个顶点出发构造网G的最小生成树T,输出T的各条边。

k=LocateVex(G,u);

for(j=0;

j<

G.vexnum;

++j)

if(j!

=k)closedge[j]={u,G.arcs[k][j].adj};

//{adjvex,lowcost}

closedge[k].lowcost=0;

//初始,U={u}

for(i=1;

i<

++i){//选择其余G.vexnum-1个顶点

k=minimum(closedge);

printf(closedge[k].adjvex,G.vexs[k]);

//输出生成树的边

//第k顶点并入U集

closedge[k].lowcost=0;

for(j=0;

G.vexnum;

if(G.acrs[k][j].adj<

closedge[j].lowcost)closedge[j]={G.vexs[k],G.arcs[k][j].adj};

}//for

}//MiniSpanTree

假设网中有n个顶点,则第一个进行初始化的循环语句的频度为n,第二个循环语句的频度为n-1。

其中有两个内循环:

其一是在closedge[v].lowcost中求最小值,其频度为n-1;

其二是重新选择具有最小代价的边,其频度为n。

由此,普里姆算法的时间复杂度为O(n2),与网中的边数无关,因此适用于求边稠密的网的最小生成树。

2.克鲁斯卡尔(Kruskal):

由点到线,适合边稀疏的网。

时间复杂度:

O(e*loge)

Kruskal算法是一种按照网中边的权值递增的顺序构造最小生成树的方法。

基本思想是:

1)设无向连通网为G=(V,E),令G的最小生成树为T,其初态为T=(V,{}),即开始时,最小生成树T由图G中的n个顶点构成,顶点之间没有一条边,这样T中各顶点各自构成一个连通分量。

2)在E中选择代价最小的边,若该边依附的顶点落在T中不同的连通分量,则将此边加入到T中,否则舍弃此边而选择下一条边(若该边依附的两个顶点属于同一个连通分量,则舍去此边,以免造成回路)。

依此类推,当T中的连通分量个数为1时,此连通分量便为G的一棵最小生成树。

按照Kruskal方法构造最小生成树的过程如图所示:

在构造过程中,按照网中边的权值由小到大的顺序,不断选取当前未被选取的边集中权值最小的边。

依据生成树的概念,n个结点的生成树,有n-1条边,故反复上述过程,直到选取了n-1条边为止,就构成了一棵最小生成树。

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中的序号。

需说明的是,在程序中将顶点的数据类型定义成整型,而在实际应用中,可依据实际需要来设定。

21

22

23

24

25

26

27

28

29

30

31

32

33

typedefintelemtype;

typedefstruct{

elemtypev1;

elemtypev2;

intcost;

}EdgeType;

voidKruskal(EdgeTypeedges[],intn)

/*用Kruskal方法构造有n个顶点的图edges的最小生成树*/

{intfather[MAXEDGE];

inti,j,vf1,vf2;

for(i=0;

n;

i++)father[i]=-1;

i=0;

j=0;

while(i<

MAXEDGE&

&

n-1)

{vf1=Find(father,edges[i].v1);

vf2=Find(father,edges[i].v2);

if(vf1!

=vf2)

{father[vf2]=vf1;

j++;

printf(“%3d%3d\n”,edges[i].v1,edges[i].v2);

}

//find函数

intFind(intfather[],intv)

/*寻找顶点v所在树的根结点*/

{intt;

t=v;

while(father[t]>

=0)

t=father[t];

return(t);

2.AOV网与拓扑排序:

由偏序定义得到拓扑有序的操作便是拓扑排序。

建立模型是AOV网

2.1.AOV网(Activityonvertexnetwork)

所有的工程或者某种流程可以分为若干个小的工程或阶段,这些小的工程或阶段就称为活动。

若以图中的顶点来表示活动,有向边(弧)表示活动之间的优先关系,则这样活动在顶点上的有向图称为AOV网(ActivityOnVertexNetwork)。

在AOV网中,若从顶点i到顶点j之间存在一条有向路径,称顶点i是顶点j的前驱,或者称顶点j是顶点i的后继。

若<

i,j>

是图中的弧,则称顶点i是顶点j的直接前驱,顶点j是顶点i的直接后驱。

AOV网中的弧表示了活动之间存在的制约关系。

例如,计算机专业的学生必须完成一系列规定的基础课和专业课才能毕业。

学生按照怎样的顺序来学习这些课程呢?

这个问题可以被看成是一个大的工程,其活动就是学习每一门课程。

这些课程的名称与相应代号如表所示。

课程之间的优先关系图:

该图的拓扑有序系列:

注意:

在AOV

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

当前位置:首页 > 高中教育 > 高考

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

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