数据结构 图(概念篇)

图的基本概念

图(Graph)是由顶点(Vertex)边(Edge)组成的非线性数据结构,用于表示实体(顶点)及其关系(边)。数学上表示为 ( G = (V, E) ),其中 ( V ) 是顶点集合,( E ) 是边集合。

图的分类

  1. 无向图

    边没有方向,表示为 ( (u, v) ),表示顶点 ( u ) 和 ( v ) 双向连通。例如社交网络中的好友关系。循序颠倒不影响表达。

  2. 有向图

    边有方向,表示为 ( < u, v > ),表示从顶点 ( u ) 指向 ( v ) 的单向关系。例如网页超链接。​​​这样的表示方式具有方向性,不能颠倒方向,颠倒方向意思相反。

  3. 加权图

    边附带权值,表示关系的强度或成本。例如地图中城市间的距离。就是在指向路径多了距离的数值量。

  4. 稀疏图与稠密图

    稀疏图边数远少于最大可能边数,稠密图边数接近最大可能边数。

在无向图中,节点的度(Degree)是指与该节点相连的边的数量。例如,若节点A与节点B、C、D相连,则节点A的度为3。自环(节点连接到自身的边)通常会被计算两次(即贡献2度)。

在有向图中,节点的度分为入度(In-degree)和出度(Out-degree)。入度是指指向该节点的边的数量,而出度是指从该节点出发的边的数量。例如,若节点A有两条边指向其他节点,一条边指向自身,则其出度为2(自环通常不计入出度),入度为1(自环通常计入入度)。

度的计算方法

对于无向图,可以通过邻接矩阵或邻接表计算节点的度。邻接矩阵中,节点i的度为第i行或第i列非零元素的个数(对于无自环图)。邻接表中,节点i的度是其邻接链表中的元素数量。

对于有向图,入度是邻接矩阵中第i列非零元素的个数,而出度是第i行非零元素的个数。邻接表中,出度是节点i邻接链表的长度,入度需要遍历所有邻接链表统计指向节点i的次数。

度的性质

  • 无向图中,所有节点度的和等于边数的两倍(握手定理)。
  • 有向图中,所有节点的入度和等于出度和,且等于边数。
  • 任何图中,奇数度节点的数量为偶数(无向图)。

图的遍历方式

深度遍历:

深度遍历原则就是优先遍历,如果遇到死胡同或者遇到已经走过的位置就停止遍历,退回到最后遇到的岔路

以A为头节点

输出结果:ABECFD

以B为头节点

输出结果:BECADF

以C为头节点:

输出结果:CABEFD

广度遍历:

广度遍历原则遇到岔路优先遍历各个岔路口,让后在从最开始遍历的位置开始遍历,遇到岔路口就继续刚刚操作。

以A为头节点

输出结果:ABCDEF

以B为头节点

输出结果:BEACDF

以C为头节点:

输出结果:CAEBDF

图的表示方法

邻接矩阵

矩阵类似二维的数组表达方式,而对于邻接矩阵来说就是把对应的节点放入对应的位置,横轴和纵轴的方向都一一对应的放入节点。类似下面。在非加权图中,一般通过1和0表示边的存在,因为不存在A到A,B到B......所以对应的位置都为0,而在加权图中,就会用权的数值和无限来表示边的存在。(无线取对应的类型的最大整数,char 128,short 32768)

矩阵图

矩阵示例图及图的表示图

邻接表

我们会发现在邻接矩阵如果在稀疏图的时候,邻接矩阵会存现很多的空缺的位置导致空间浪费。所以就出现邻接表来减少空间浪费。

邻接表的原理是通过每一个节点打印出对应存储的边。

感谢观看!

悠仁さん

相关推荐
带土11 小时前
1. 数据结构简单复习回顾(线性结构)
数据结构
Irissgwe1 小时前
二叉树进阶
数据结构·c++·算法·c·二叉搜索树
hairenwangmiao1 小时前
c++排序(第一章----桶排序与sort排序)
数据结构·c++·排序
xieliyu.1 小时前
Java数据结构:从0开始手搓Hash桶
java·数据结构·哈希算法
Irissgwe2 小时前
数据结构-二叉树
数据结构·c++·二叉树·c·
山峰哥2 小时前
VBA数据结构之争:Dictionary vs Collection,性能差3倍!
服务器·数据结构·数据库·windows·sql·算法·哈希算法
青山木12 小时前
Hot 100 --- 轮转数组
java·数据结构·算法
WBluuue15 小时前
数据结构与算法:有序表(二):跳表
数据结构·c++·算法·skiplist
不好听61316 小时前
深入理解链表:线性数据结构的另一面
javascript·数据结构