37. 蛤蟆的数据结构笔记之三十七图的概念
本篇名言:“宿命论是那些缺乏意志力的弱者的借口。--罗曼?
罗兰”
又到了一个新概念,这次咱们来看 这个图,图一看给人一种凌乱的感觉。那么它在数据结构中又是什么呢?
欢迎转载,转载请标明出处:
1. 图的概念
图(graph)是一种比线性表、树更为复杂的数据结构。在线性表中,数据元素之间呈线性关系,即每个元素只有一个直接前驱和一个直接后继。在树型结构中,数据元素之间有明显的的层次关系,即每个结点只有一个直接前驱,但可有多个直接后继,而在图结构中,每个结点即可有多个直接前驱,也可有多个直接后继,因此,树结构是图结构的一种特殊情形。当一个树结构中允许同一结点出现在不同分支上时,该树结构实际上就是一个图结构。图的最早应用可以追溯到十八世纪数学家欧拉(EULer)利用图解决了著名的哥尼斯堡桥的问题,为图在现代科学技术领域的应用奠定了基础。
2. 图的定义
图是一种多对多的结构关系,每个元素可以有零个或多个直接前趋;零个或多个直接后继。
图G是由一个顶点集V和一个边集E构成的数据结构。记为二元组形式:G= (V, E)
其中:
l V是由顶点构成的非空有限集合,记为:V={V0, V1, V2, …Vn-1}
l E是由V中顶点的对偶构成的有限集合,记为:E={(V0, V2), (V3, V4), … },若E为空,则图中只有顶点而没有边。
其中对偶可以表示成:
l (Vi, Vj)—无序的对偶称为边,即(Vi, Vj)=(Vj, Vi) ,其图称为无向图
l <Vi, Vj>—有序的对偶称为弧,即<Vi, Vj> ≠<Vj, Vi>,则称Vi为弧尾,称Vj为弧头,该图称为有向图
图:记为 G=( V, E )
其中:V 是G的顶点集合,是有穷非空集;E是G的边集合,是有穷集。
有向图: 图G中的每条边都是有方向的;
无向图:图G中的每条边都是无方向的;
若 n 个顶点的无向图有n(n-1)/2 条边, 称为无向完全图
若 n 个顶点的有向图有n(n-1)条边, 称为有向完全图
2.1 连通图
在无向图中, 若从顶点v1到顶点v2有路径, 则称顶点v1与v2是连通的。如果图中任意一对顶点都是连通的, 则称此图是连通图。
非连通图的极大连通子图叫做连通分量。
2.2 强连通图
在有向图中, 若对于每一对顶点vi和vj, 都存在一条从vi到vj和从vj到vi的路径, 则称此图是强连通图。
非强连通图的极大强连通子图叫做强连通分量。
2.3 生成树
是一个极小连通子图,它含有图中全部顶点,但只有n-1条边。
如果在生成树上添加1条边,必定构成一个环。
若图中有n个顶点,却少于n-1条边,必为非连通图。
3. 图的存储结构
由于图中任意两个顶点之间都可能存在联系,因此难以以数据元素在存储区中物理位置表示它们间的关系,但可以借助数组表示之。
另一方面,也可以用多重链表表示图。但由于图中顶点的度可能相差悬殊,会因此造成空间的浪费;反之,若按每个顶点的度设计不同的结点结构,又会造成操作上的不便。
应根据具体的图和需要,设计恰当的结点结构和表结构。
图的存储结构至少要保存两类信息:
1)顶点的数据;
2)顶点间的关系。
在不同的存储结构下,实现各种操作的效率可能是不同的。所以在求解实际问题时,要根据求解问题所需操作,选择合适的存储结构。
常用的图的存储结构有邻接矩阵、邻接表、十字链表和邻接多重表。
十字链表的方法在之前有过记录,在此不再介绍了。
3.1 邻接矩阵表示法
对于一个具有n个结点的图,可以使用n*n的矩阵(二维数组)来表示它们间的邻接关系。矩阵A(i,j)=1表示图中存在一条边(Vi,Vj),而A(i,j)=0表示图中不存在边(Vi,Vj)。实际编程时,当图为不带权图时,可以在二维数组中存放bool值,A(i,j)=true表示存在边(Vi,Vj),A(i,j)=false表示不存在边(Vi,Vj);当图带权值时,则可以直接在二维数值中存放权值,A(i,j)=null表示不存在边(Vi,Vj)。
3.2 邻接表表示法
邻接表由表头结点和表结点两部分组成,其中图中每个顶点均对应一个存储在数组中的表头结点。如这个表头结点所对应的顶点存在相邻顶点,则把相邻顶点依次存放于表头结点所指向的单向链表中。表结点存放的是邻接顶点在数组中的索引。对于无向图来说,使用邻接表进行存储也会出现数据冗余,表头结点A所指链表中存在一个指向C的表结点的同时,表头结点C所指链表也会存在一个指向A的表结点。
3.3 邻接多重表表示法
邻接多重表(AdjacencyMultilist)主要用于存储无向图。因为,如果用邻接表存储无向图,每条边的两个边结点分别在以该边所依附的两个顶点为头结点的链表中,这给图的某些操作带来不便。例如,对已访问过的边做标记,或者要删除图中某一条边等,都需要找到表示同一条边的两个结点。因此,在进行这一类操作的无向图的问题中采用邻接多重表作存储结构更为适宜。
概念介绍,在此大家不必过于纠结,后续我们会一个一个通过实际代码来实现之的,相信通过代码之后大伙一定会记的刻骨铭心。
版权声明:本文为博主原创文章,未经博主允许不得转载。