内容简介:数据结构领域,图(Graph)是一种复杂的非线性结构,在图结构中,每个元素都可以有零个或多个前驱,也可以有零个或多个后继,也就是说,元素之间的关系是任意的。本文对图的基础支持做一个简单的总结。图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合。
1. 介绍
数据结构领域,图(Graph)是一种复杂的非线性结构,在图结构中,每个元素都可以有零个或多个前驱,也可以有零个或多个后继,也就是说,元素之间的关系是任意的。
本文对图的基础支持做一个简单的总结。
2. 定义
2.1 图的定义
图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合。
2.2 图的分类
2.2.1 有向/无向/完全
按照方向分为无向图和有向图。
上图中,左图为无向图是由顶点和边构成,右图为有向图是由顶点和弧(有向边构成)。弧有弧头和弧尾区别。
在用数学方式表示时,无向边用()表示,有向边用<>表示。现在我们讲解的图全是简单图。
如果任意两个顶点之间都存在边叫完全图,有向的边叫有向完全图。如果无重复的边或者顶点到自身的边叫简单图。上图左侧为简单图
有些图的边或弧具有与它相关的数字,这种带权的图通常称为网,下面就是一个带权的图
- 无向图:顶点的边数是度
- 有向图:
- 入度:方向指向顶点的边;
- 出度:方向背向顶点的边。
- 顶点的度=出度+入度。
2.5 路径长度
路径的长度是路径上边或是弧的数目。对于相同的两个顶点,不同的路径可能会有不同的路径长度。
上图中,左侧路径的长度为2,右侧路径的长度为3
2.6 连通
-
无向图:任意两个顶点是相通的就是连通图。下图中,左侧为非连通的,右侧为连通的
-
有向图:任意两个顶点是相通的就是强连通图,下面左侧的图中,不存在D->A不是连通的,所以不是强连通图,而右侧的则为强连通图。
3. 图的存储
图的结构比价复杂,任意两个顶点之间都可能存在关系,不能用简单的顺序存储结构来表示。如果运用多重链表,即一个数据域多个指针域组成的结点表示图中一个结点,则造成大量存储单元浪费。
3.1 邻接矩阵
邻接矩阵用两个数组保存数据。一个一维数组存储图中顶点信息,一个二维数组存储图中边或弧的信息,结构如下。
邻接矩阵表示带权图的方法如下:
带权图值的说明如下:
- 0:在主对角线上表示指向自己,否则表示权值
- 无穷大:表示两个顶点不通
- 权值
特点:
- 0表示无边,1表示有边
- 顶点的度是行内数组之和。
- 求取顶点邻接点,将行内元素遍历下。
- 无向图:无向图中二维数组是个对称矩阵
- 有向图:各行之和是出度,各列之和是入度。
缺点:邻接矩阵对于边数相对顶点较少的图,就是对存储空间极大的浪费。
3.2 邻接表
邻接表:数组和链表相结合的存储方法为邻接表。
存储结构如下:
- 图中顶点用一个一维数组存储。
- 图中每个顶点的所有邻接点构成一个线性表。
从图中得知,顶点表的各个结点由data和Firstedge两个域表示,data是数据域,存储顶点信息,firstedge是指针域,指向边表的第一个结点,即顶点的第一个邻接点。边表结点由adjvex和next两个域组成。adjvex是邻接点域,存储某顶点的邻接点在顶点表中坐标,next存储边表中下一个结点指针。比如v1顶点与v2、v0互为邻接点,则在v1边表中,adjvex分别为0和2。
有向图也可以用邻接表,出度表叫邻接表,入度表尾逆邻接表。
3.3 十字链表
在邻接表中针对有向图,分为邻接表和逆邻接表,导致无法从一个表中获取图的入读和出度的情况,于是诞生了十字链表,相关结构如下:
- 顶点结构
data | firstin | firstout |
---|
-
firstin:入边表头指针,指向顶点入边表的第一个结点。
-
firstout:出边表头指针,指向顶点出边表第一个结点。
- 边结构
tailvex | headvex | headlink | taillink |
---|
- tailvex是指弧起点在顶点表的下标
- headvex弧终点在顶点表的下标
- headlink入边表指针域,指向终点相同的下一条边
- taillink是指边表指针域,指向起点相同的下一条边。
示例如下:
十字链表把邻接表和逆邻接表整合在了一起,便于统计顶点的出度和入度,且算法的时间复杂度和邻接表相同。
3.4 邻接多重表
如果使用邻接存储无向图,操作顶点很方便,但是对于边的操作比较麻烦(例如删除边),使用邻接多重表可以解决该问题,邻接多重表的边结构的定义如下:
ivex | ilikn | jvex | jlink |
---|
ivex和jvex是与某条边依附的两个顶点在顶点表中的下标。ilink指向依附项点ivex的下一条边,jlink指向依附顶点jvex的下一条边。
3.5 边集数组
边集数组由两个一位数组构成,一个用来存储顶点信息,一个用来存储边信息。边集数组关注的重点是对边的操作,比较适合一次对边进行处理的操作,如果想要获取某个顶点的度可能就不大适合。
边的结构表示为:
begin | end | weight |
---|
例子如下:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
机器学习算法原理与编程实践
郑捷 / 电子工业出版社 / 2015-11 / 88.00
本书是机器学习原理和算法编码实现的基础性读物,内容分为两大主线:单个算法的原理讲解和机器学习理论的发展变迁。算法除包含传统的分类、聚类、预测等常用算法之外,还新增了深度学习、贝叶斯网、隐马尔科夫模型等内容。对于每个算法,均包括提出问题、解决策略、数学推导、编码实现、结果评估几部分。数学推导力图做到由浅入深,深入浅出。结构上数学原理与程序代码一一对照,有助于降低学习门槛,加深公式的理解,起到推广和扩......一起来看看 《机器学习算法原理与编程实践》 这本书的介绍吧!