图神经网络前置基础知识——数据结构与算法中的图

1. 图的定义及术语

在线性结构中,数据元素之间满足唯一的线性关系,每个数据元素(除第一个和最后一个外)只有一个直接前趋和一个直接后继;

在树形结构中,数据元素之间有着明显的层次关系,并且每个数据元素只与上一层中的一个元素(parent node)及下一层的多个元素(孩子节点)相关;

而在图形结构中,节点之间的关系是任意的,图中任意两个数据元素之间都有可能相关,因此说,图是一种复杂的非线性结构。

图用G= (V,E) 表示,其中:

  • V 是顶点 (vertex) 集合
  • E 是边 (edge) 的集合

根据图中的边是否有方向可以分为有向图和无向图:

无向图

对于一个图,若每条边都是没有方向的,则称该图为无向图
在这里插入图片描述

有向图

对于一个图,若每条边都是有方向的,则称该图为有向图在这里插入图片描述

完全图

任意两个点都有一条边相连

稀疏图

有很少边或弧的图,其指标为稀疏因子,若稀疏因子小于 0.05 ,可认为是稀疏图

密集图

有较多边或弧的图

顶点的度

对于无向图,顶点的度表示以该顶点作为一个端点的边的数目。比如上面的无向图中顶点 V 3 V_3 V3的度 D ( V 3 ) = 3 D(V_3)=3 D(V3)=3

对于有向图,顶点的度分为入度和出度。某一顶点的度等于其入度和出度之和。

入度

入度表示以该顶点为终点的入边数目

出度

出度是以该顶点为起点的出边数目

子图

图G= ( V,E ),G’= ( V’,E’)中,若 V’≤V,E’≤E,并且 E’中的边所关联的顶点都在 V’中,则称图G’是图G的子图:
在这里插入图片描述

路径

在这里插入图片描述

从顶点Vp到顶点Vq的路径即顶点序列Vp,Vi1,Vi2,…,Vin,Vq,使得 (Vp,Vi1) ,(Vi1,Vi2) ,…, (Vin,Vq)都在 E 中

换句话说,路径就是从图上的一点出发,到图上另一点的方法。从图上的一点出发,到图上另一点的方法可能不止一个,即可能有多个路径。

回路

回路也称为环。简单来说,回路是指一条路径的起点和终点为同一个顶点。

在这里插入图片描述
无向图中,如果两个结点之间有平行边,容易让人误看作“环”

网络

带”权值”的连通图称为网

在这里插入图片描述

2. 图的存储结构

相邻矩阵

图的相邻矩阵( adjacency matrix,或邻接矩阵)表示顶点之间的邻接关系,即有没有边

有向图的相邻矩阵

在这里插入图片描述

无向图的相邻矩阵

在这里插入图片描述

邻接表

对于稀疏图,可以采用邻接表存储法:

  • 边较少,相邻矩阵就会出现大量的零元素
  • 相邻矩阵的零元素将耗费大量的存储空间和时间

顶点和边的信息如下所示:
在这里插入图片描述

无向图的邻接表表示

无向图同一条边在邻接表中出现两次
在这里插入图片描述
上面的图用邻接表可表示为:

在这里插入图片描述

带权图的邻接表表示

在这里插入图片描述

在这里插入图片描述

有向图的邻接表(出边表)

在这里插入图片描述
在这里插入图片描述

有向图的逆邻接表(入边表)

在这里插入图片描述
在这里插入图片描述

十字链表

十字链表 (Orthogonal List) 可以看成是邻接表和逆邻接表的结合

对应于有向图的每一条弧有一个表目,共有5个域:

  • 头 headvex
  • 尾 tailvex
  • 下一条共尾弧 tailnextarc
  • 下一条共头弧 headnextarc
  • 弧权值等 info 域

顶点表目由3个域组成:

  • data 域
  • firstinarc 第一条以该顶点为终点的弧
  • firstoutarc 第一条以该顶点为始点的弧

在这里插入图片描述
十字链表有两组链表组成:

  • 行和列的指针序列

每个结点都包含两个指针:

  • 同一行的后继
  • 同一列的后继

在这里插入图片描述

3. 图的遍历

图的遍历 (graph traversal)即给出一个图G和其中任意一个顶点V0,从V0出发系统地访问G中所有的顶点,每个顶点访问而且只访问一次

从一个顶点出发,试探性访问其余顶点,同时必须考虑到下列情况

  • 从一顶点出发,可能不能到达所有其它的顶点,如:非连通图;
  • 也有可能会陷入死循环,如:存在回路的图

一般情况下,可以为每个顶点保留一个 标志位 (mark bit):

  • 算法开始时,所有顶点的标志位置零
  • 在遍历的过程中,当某个顶点被访问时,其标志位就被标记为已访问

深度优先遍历(depth-first search)

深度优先搜索(简称DFS) 类似于树的先根次序遍历,尽可能先对纵深方向进行搜索:

  1. 选取一个未访问的点 v0 作为源点
  2. 访问顶点 v0
  3. 递归地深搜遍历 v0 邻接到的其他顶点
  4. 重复上述过程直至从 v0 有路径可达的顶点都已被访问过
  5. 再选取其他未访问顶点作为源点做深搜,直到图的所有顶点都被访问过

在这里插入图片描述
深度优先搜索的顺序是:

a->b->c->f->d->e->g

广度优先遍历(breadth-first search)

广度优先搜索 (breadth-first search,简称 BFS)。其遍历的过程是:

  1. 从图中的某个顶点 v0 出发
  • 访问并标记了顶点 v0 之后
  • 一层层横向搜索 v0 的所有邻接点
  • 对这些邻接点一层层横向搜索,直至所有由 v0 有路径可达的顶点都已被访问过
  1. 再选取其他未访问顶点作为源点做广搜,直到所有点都被访问过

在这里插入图片描述

广度优先搜索的顺序是:

a->b->d->e->f->c->g

4. 最短路径

单源最短路径(single-source shortest paths)

单源最短路径是给定带权图 G = <V,E>,其中每条边 (vi,vj) 上的权W[vi,vj] 是一个 非负实数 。计算从任给的一个源点 s 到所有其他各结点的最短路径

迪杰斯特拉(Dijkstra)算法

基本思想
  1. 把所有结点分成两组:
    • 第一组 U 包括已确定最短路径的结点
    • 第二组 V–U 包括尚未确定最短路径的结点
  2. 按最短路径长度递增的顺序逐个把第二组的结点加到第一组中:
    • 直至从 s 出发可达结点都包括进第一组中

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Dijkstra算法单源最短路径迭代过程

在这里插入图片描述

Dijkstra 算法是贪心法,不适用于负权值的情况。因为权值当作最小取进来后,不会返回去重新计算,即使不存在负的回路,也可能有在后面出现的负权值,从而导致整体计算错误

每对结点间的最短路径

Floyd算法求每对结点之间的最短路径

用相邻矩阵 adj 来表示带权有向图

基本思想

• 初始化 adj(0) 为相邻矩阵 adj
• 在矩阵 adj(0)上做 n 次迭代,递归地产生一个矩阵序列adj(1),…,adj(k),…,adj(n)
• 其中经过第k次迭代,adj(k)[i,j] 的值等于从结点vi 到结点 vj 路径上所经过的结点序号不大于 k 的最短路径长度

其根本思想是动态规划法

5. 最小生成树

图 G 的生成树是一棵包含 G 的所有顶点的树,树上所有权值总和表示代价,那么在 G 的所有的生成树中代价最小的生成树称为图 G 的 最小生成树(minimum-cost spanning tree,简称 MST)

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.郑先生_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值