Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >[ data ] 数据结构之图结构的要点梳理

[ data ] 数据结构之图结构的要点梳理

原创
作者头像
GavinUI
修改于 2021-10-11 02:49:18
修改于 2021-10-11 02:49:18
1.1K0
举报
文章被收录于专栏:GavinUIGavinUI

图结构定义

图结构是数据元素呈多对多关系,就是任意两个元素存在这样的关系。如果用一个公式来表示就是由顶点集合和顶点之间的关系集合组成的一种数据结构

Graph = ( V , E ) ;

E1 = { ( X , Y ) | X , Y < V } 边的合集 ( < 号是表示包含)

E2 = { ( X , Y ) | X , Y < V } 弧的合集

无向图

使用公式表示无向图:

N = { V, E } , V = { 0, 1, 2 , 3, 4, 5 } , E = { ( 0, 1 ), ( 0, 2 ) ( 0, 4 ), ( 0, 5 ), ( 1, 2 ) ( 2, 3 ), ( 3, 4 ), ( 2, 4 ) ( 5, 3 ), ( 5, 4 ) }

画出的图为:

另:在无向图中还有一种叫无向完全图,指的是任意两点都有连接。

它的边的数量是: 1/2(n(n-1));

连通图和连通分量

连通图指的是两个点的连接。

连通分量指无向图中的极大连通分量,且连通图就是无向图。一个无向非连通图会有多个的连通分量,举例:

在这两个例子中,一个无向非连通图就有两个连通的分量。

有向图

使用公式表示有向图:和无向图优点不同的是,有向图的标记是使用 < x, y > 的一个 arc ,且 x 为弧尾,y 弧头。

N = { V, E } , V = { 0, 1, 2 , 3, 4 } , E = { < 0, 1 >, < 1, 2 >, < 0, 3 >, < 0, 4 >, < 2, 4 >, < 3, 2 > }

画出的图为:

强连通图和强连通分量

强连通图指的是两个点之间有弧线。

强连通分量指有向图中的极大连通分量(有去有回),且连通图就是有向图。一个有向图会有多个的强连通分量,举例:

在这两个例子中,一个有向图就有两个强连通的分量。

另:在无向图中还有一种叫有向完全图,指的是任意两点都有两条弧。

路径

路径指的是从一个顶点到另一个顶点的所有方式,以无向和有向图的例子来看,从 0 到 3 的路径分别是,如图:

无向图 0 - 3 的路径是:

  1. 0 - 1 - 2 - 3
  2. 0 - 2 - 3
  3. 0 - 4 - 3
  4. 0 - 5 - 4 - 3
  5. 0 - 2 - 4 - 3 有向图 0 - 3 的路径是(需要根据弧的指向) :
  6. 0 - 3 只有一条,原因是 3 的入度只有一个,而且是从 0 开始的。

简单路径

指的点不重复出现的一个路径,以上图的无向图为例,0 - 3 的简单路径就是

0 - 5 - 4 - 3

环路径

顾名思义就是一个环,起点和终点保持一致即可。

0 - 1 - 2 - 3 - 4 - 5 - 1

生成树

一个连通图的生成树是一个极小的连通图。核心就是最多的点,最少的边。一个由 n 个点的生成树有且仅有 n - 1 条边。

生成森林

有向图的生成树是一个由若干个树组成

有向树是一个只有一个顶点且入度为 0 其余点的入度为 1 的有向图。

7 和 9 入度都是 0 。

图的存储结构

邻接矩阵

邻接矩阵实质上是一个二维数组,对于不带权图,1表示两个顶点相连接的弧或者边,以 0 表示不邻接。

A【i】【j】 = ...... ;

以下图为例:

无向图和有向图他们的邻接矩阵分别对应的是

从矩阵上来看,很明显无向图的连接矩阵是对称的,而有向图的矩阵是非对称的。

邻接表

邻接矩阵实质上是一个二维数组 + 链表,他是在每个节点中有一个下标指向,还是以刚才的图作为例子,加上下标。

他们的邻接表分别对应的是:

无向图是按下标记,有向图是按出度,其中还有一个叫逆邻接表,逆邻接表是按入度的方式来,和邻接表相反。

图的遍历

从图的某一点开始,访问图中的其余顶点且每个点至少访问一次。

深度优先搜索 DFS

原理是从某个点向下查找,当到达末端时,返回向上一个节点查找是否还有未找到的节点,有则从这个节点向下查找,如果没有则再向上一个节点重复刚刚的操作。

深度优先搜索的实现核心是使用堆栈的方法。

他的过程是

第一步 :1 - 2 - 4 - 8 - 5

第二步,回退(弹出) :5 - 8 - 4 - 2 - 1

第三步 :3 - 6

第四步,回退(弹出):6 - 3

第五步 :7

所以,最后的结果是 1 - 2 - 4 - 8 - 5 - 3 - 6 - 7 。

注意,这个例子有点像树,但是实际上他是图,因为树的前提是一个节点有且只有一个双亲,这里的 8 是有了两个双亲,所以他不满足树的条件。

广度优先搜索 BFS

广度优先搜索实质上是一个分层搜索,将一层节点查询完之后再向下一层几点开始查找,这种方法说明他没有回退的情况。

广度优先搜索的实现核心是使用队列的方法。

以深度优先搜索的图为例子,他的过程是: 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 。

最小生成树

最小的生成树意思就是最多的点和最少的边,n 和 n- 1 条边,同时不能产生回路且各边上的权值总和最小。

实现最小生成树有两种算法一种是普里姆算法,另一种是克鲁斯卡尔算法。

以这个为例子

普里姆算法

普里姆算法就是找点再找边再找点依次重复。

结果就是 1 - 4 - 6 - 2 - 3 - 5 (找点 算法)

克鲁斯卡尔算法

克鲁斯卡尔是不需要起点的,他是根据最小的边开始查找其余的边。

结果就是 2 - 3 - 3 - 3 - 7(找边 算法)

最短路径

最短的路径指的是图中的所有点他们之间的距离,或者说是某一点到任意一点的最小距离。

狄杰斯特拉(Dijkstra)算法

这个算法的思想就是,找到点与点之间的最小距离的边且只走这一步,之后再从这个点开始找最小距离的边同时也是只走一步,这个时候更新点与点之间的数据,然后继续在往下走。

其中,两点相连的直接记录权值,如果两点之间没有连接的计算为无穷大。

用一个例子来说明:

第一轮 N1: 从 0 开始,记录到达各点权值,若没有直接到达的边记录为 无穷大。

第二轮 N2: 从第一轮中得出,最小的是边指向 4 ,那么就从 4 开始 。4 到 2 ,也就是 0 - 4 - 2,10 + 50 = 60 。更新数值,其余不变。

第三轮 N3: 从第二轮中得出,由于 4 已选 ,那最小的是边指向 3 ,那么就从 3 开始 。3 到 2 ,也就是 0 - 3 - 2,30 + 20 = 50 。更新数值,其余不变。

第四轮 N4: 从第三轮中得出,由于 4,3 已选 ,那最小的是边指向 2 ,那么就从 2 开始 。0 到 2 ,没有连接,但是上一轮的指向是 50 ,那么就是 0 - 2 - 1 ,50 + 10 = 60 。更新数值,其余不变。

第五轮 N5: 数值不变,不更新。

这个就是最终结果

拓扑排序

拓扑排序的作用是可以得知每个点的优先级,而拓扑排序就是适用于有向无环图。

拓扑排序的算法思想是,在有向图中选一个没有前驱的顶点且输出也就是入度为0点的点,删除他的边和弧。重重上述操作,直到所有的点输出。

举例:

输出 0 ,输出 1 , 输出 3 , 输出 2 , 输出 4。

数据结构不一定都可以在项目中实际应用,但也可以作为了解。下次看到的时候心里也大概知道这是一个什么样东西,需要使用了再深入了解方法。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【数据结构】图论核心算法解析:深度优先搜索(DFS)的纵深遍历与生成树实战指南​
在上一篇中,我们共同揭开了广度优先搜索(BFS)的神秘面纱:它以“分层扩散”的方式遍历图结构,借助队列实现层序遍历,擅长解决最短路径和连通性分析问题(例如社交网络中的好友推荐)。BFS如同一束光波,由近及远均匀覆盖每个角落,确保无遗漏地探索所有可能性。
蒙奇D索隆
2025/06/08
4120
【数据结构】图论核心算法解析:深度优先搜索(DFS)的纵深遍历与生成树实战指南​
《大话数据结构》总结第一章 绪论第二章 算法第三章 线性表第四章 栈和队列第五章 字符串第六章 树第七章 图第八章 查找第九章 排序
第一章 绪论 什么是数据结构? 数据结构的定义:数据结构是相互之间存在一种或多种特定关系的数据元素的集合。 第二章 算法 算法的特性:有穷性、确定性、可行性、输入、输出。 什么是好的算法? ----正确性、可读性、健壮性、时间效率高、存储量低 函数的渐近增长:给定两个函数f(n)和g(n),如果存在一个整数N,使得对于所有的n>N,f(n)总是比g(n)大,那么,我们说f(n)的增长渐近快于g(n)。于是我们可以得出一个结论,判断一个算法好不好,我们只通过少量的数据是不能做出准确判断的,如果我们可以
SeanCheney
2018/04/24
1.5K0
《大话数据结构》总结第一章 绪论第二章 算法第三章 线性表第四章 栈和队列第五章 字符串第六章 树第七章 图第八章 查找第九章 排序
Python数据结构与算法笔记(5)
邻接矩阵优点是简单,对于小图,很容易看到哪些节点连接到其他节点。但是大多数单元格是空的,即稀疏。
2018/09/03
1.1K1
Python数据结构与算法笔记(5)
【数据结构】总结面试最常用的55道填空题
树是由n个结点所构成的有限集合,当n=0时,称为空树 树的表示法有4种,分别为:文氏图表示法、凹入图表示法、广义表表示法以及树形表示法 结点的度是指结点所拥有子树的数目 二叉树是一种特殊的树,它的每个结点最多只有两颗子树,并且这两课子树也是二叉树 在一棵二叉树中,若其所有结点或叶结点,或左、右子树都非空,且所有叶结点都在同一层,则称这棵二叉树为满二叉树 在二叉树的第i层上至多有2i个结点(i≥0) 深度为h(h≥0)的二叉树上至多含2h-1个结点 对于任何一棵二叉树,若其叶结点的个数为n0,度为2的结点个数
陶然同学
2023/02/27
5360
数据结构 图
1-1 无向连通图至少有一个顶点的度为1 错误: 无向连通图考点: 1. 每条边连接两个顶点,所有顶点的度之和等于边数的2倍 2.记住两个特殊的无相连通图模型: A: B: 1-2 用邻接表法存储图
Kindear
2018/01/15
1.9K0
数据结构 图
数据结构-图结构
图Graph是由顶点(图中的节点被称为图的顶点)的非空有限集合V与边的集合E(顶点之间的关系)构成的。 若图G中的每一条边都没有方向,则称G为无向图。 若图G中的每一条边都有方向,则称G为有向图。
WuShF
2023/07/08
4580
数据结构-图结构
期末复习之数据结构 第7章 图
含有n个顶点的无向完全图有多少条边? n×(n-1)/2条边 含有n个顶点的有向完全图有多少条弧? n×(n-1)条边
henu_Newxc03
2021/12/28
7110
期末复习之数据结构 第7章 图
重学数据结构(七、图)
图是一种比线性表和树更为复杂的数据结构。在线性表中,数据元素之间仅有线性关系,每个数据元素只有一个直接前驱和一个直接后继;在树形结构中,数据元素之间有着明显的层次关系,并且每一层中的数据元素可能和下一层中的多个元素(即其孩子结点)相关,但只能和上一层中一个元素(即其双亲结点)相关; 而在图结构中,结点之间的关系可以是任意的,图中任意两个数据元素之间都可能相关。
三分恶
2020/12/01
7870
重学数据结构(七、图)
PHP数据结构(九) ——图的定义、存储与两种方式遍历
PHP数据结构(九)——图的定义、存储与两种方式遍历 (原创内容,转载请注明来源,谢谢) 一、定义和术语 1、不同于线性结构和树,图是任意两个元素之间都可以有关联的数据结构。 2、顶点:数据元素;弧:顶点A至顶点B的连线,弧是单向的,出发的点称为弧尾,抵达的点称为弧头;边:顶点A和B之间的连线,没有方向性。 3、有向图:由顶点和弧组成的图;无向图:由顶点和边组成的图。 4、完全有向图:n个顶点有n(n-1)个弧;完全无向图:n个顶点有n
用户1327360
2018/03/07
2K0
PHP数据结构(九) ——图的定义、存储与两种方式遍历
【自考】数据结构第五章图,期末不挂科指南,第9篇
有向图和无向图的表示法有略微的区别,注意看 G1有箭头,有向图,表示方法是 V={V~0~,V~1~,V~2~,V~3~} E = {<V~0~,V~1~>,<V~1~,V~2~>,<V~1~,V~0~>,<V~2~,V~0~>,<V~2~,V~3~>} G2无箭头,无向图,表示方法是 V={V~0~,V~1~,V~2~,V~3~} E = {(V~0~,V~1~),(V~1~,V~2~),(V~0~,V~2~),(V~2~,V~3~)}
梦想橡皮擦
2020/01/13
5650
【自考】数据结构第五章图,期末不挂科指南,第9篇
【愚公系列】软考中级-软件设计师 020-数据结构(图)
图是一种非线性数据结构,它由节点(也称为顶点)和连接这些节点的边组成。图可以用来表示各种关系和连接,比如网络拓扑、社交网络、地图等等。图的节点可以包含任意类型的数据,而边则表示节点之间的关系。图有两种常见的表示方法:邻接矩阵和邻接表。
愚公搬代码
2024/02/01
3890
图的基本概念以及DFS与BFS算法
顶点和边:图中结点称为顶点,第 i 个顶点记作 vi。两个顶点 vi 和 vj 相关联称作顶点 vi 和顶点 vj 之间有一条边,图中的第 k 条边记作 ek,ek = (vi,vj) 或 <vi,vj>。
利刃大大
2023/04/12
6950
图的基本概念以及DFS与BFS算法
各数据结构的基本概念和术语汇总
线性表中任一数据元素都可以 随机存取 ,所以 线性表的顺序存储结构是一种随机存取的存储结构。
忆想不到的晖
2020/07/15
1.1K0
各数据结构的基本概念和术语汇总
数据结构:图的定义和术语总结
本文介绍了图的定义和术语,包括顶点、边、无向图、有向图、稀疏图、稠密图、完全图、简单图、生成树、有向树、连通图、强连通图、子图、连通分量和生成森林等概念。
s1mba
2018/01/03
9590
7.4 图的连通性问题
1、在对无向图进行遍历时,对于连通图,仅需从图中任一顶点出发,进行深度优先搜索或广度优先搜索,便可访问到图中所有顶点。
小林C语言
2020/12/12
1.2K0
7.4 图的连通性问题
8-1 图结构
前面已经讲了 "一对一" 的线性存储结构、"一对多"的树结构 , 现在介绍 "多对多" 的图结构
TeeyoHuang
2019/07/02
5380
8-1 图结构
C语言图结构总结(一)
按照右手原则,每次选择上一顶点的最右边的下一顶点,走过一个顶点标记一个顶点,不能走被标记过的顶点,一条路走到黑,直到无路可走,然后回溯。 这个就是先走到最大深度,不能再深入后,再返回到有支路可走的顶点继续深入到最下面。
TagBug
2023/03/15
2.1K0
C语言图结构总结(一)
数据结构【第六章知识小结】
连通图:在无向图G中,若对任何两个顶点 v、u 都存在从v 到 u 的路径,则称G是连通图。
MIKE笔记
2023/03/22
6220
数据结构【第六章知识小结】
数据结构:图
无论是有向图还是无向图,主要的存储方式都有两种:邻接矩阵和邻接表。前者图的数据顺序存储结构,后者属于图的链接存储结构。
HLee
2021/01/19
2.1K0
数据结构:图
数据结构学习笔记(图)
一(基本概念) 1.图的定义:图是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合。 2.与线性表、树的比较: (1)线性表中我们把数据元素叫元素,树中将数据元素叫结点,在图中数据元素,我们则称之为顶点。 (2)线性表中可以没有数据元素,称为空表。树中可以没有结点,叫做空树。在图结构中,不允许没有顶点。 (3)线性表中,相邻的数据元素之间具有线性关系,树结构中,相邻两层的结点具有层次关系,而图中,任意两个顶点之间都可能有关系
希希里之海
2018/05/16
8900
推荐阅读
相关推荐
【数据结构】图论核心算法解析:深度优先搜索(DFS)的纵深遍历与生成树实战指南​
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档