欢迎光临散文网 会员登陆 & 注册

《漫画算法2:小灰的算法接近》第三章 图

2023-03-24 15:46 作者:方程星  | 我要投稿

什么是图

树的节点之间是一对多的关系,并且存在父与子的层级划分;而图的顶点(注意,这里不叫节点)之间是多对多的关系,并且所有顶点都是平等的,无所谓谁是父谁是子。
在图中,最基本的单元是顶点(Vertex),相当于树中的节点。顶点之间的关联关系,被称(Edge),每个边上的数字为边的权重(Weigh)

涉及权重的图,被称为带权图(Weighted Graph)

有向图:顶点之间的边有了方向的区分,这种带有方向的图被称为有向图

图的存储方式有很多种,最常用的方式包括邻接矩阵和邻接表

邻接矩阵

拥有n个顶点的图,它所包含的连接数量最多是n×(n-1)个。因此,要表达各个顶点之间的关联关系,最清晰易懂的方式是使用n×n的二维数组(矩阵)。

根据图的4个顶点,创建了一个4×4的矩阵; 顶点0和顶点1之间有边关联,那么矩阵中的元素A[0][1]与A[1][0]的值就是1;顶点1和顶点2之间没有边关联,那么矩阵中的元素A[1][2]与A[2][1]的值就是0

像这样表达图中顶点关联关系的矩阵,就叫作邻接矩阵

无向图对应的矩阵是一个对称矩阵;

矩阵从左上到右下的一条对角线,其上的元素值必然是0

有向图的邻接矩阵

邻接矩阵的优点:简单直观,可以快速查到一个顶点和另一顶点之间的关联关系

邻接矩阵的缺点:占用了太多的空间

邻接表

为了解决邻接矩阵占用空间的问题,人们想到了另一种图的表示方法:邻接表

在邻接表中,图的每一个顶点都是一个链表的头节点,其后连接着该顶点能够直接到达的相邻顶点
逆邻接表每一个顶点作为链表的头节点,后继节点所存储的是能够直接到达该顶点的相邻顶点

图的遍历

遍历图的两种主要方式:深度优先遍历简称DFS(Depth First Search),广度优先遍历简称BFS(Breadth First Search)

先深入探索,走到头再回退寻找其他出路的遍历方式,就叫作深度优先遍历(DFS)

样一层一层由内而外的遍历方式,就叫作广度优先遍历(BFS)

图的最短路径

迪杰斯特拉算法的原理:这个算法的本质,是不断刷新起点与其他各个顶点之间的“距离表”。

时间复杂度可以优化到O(elogn)

迪杰斯特拉算法的主要目标,是求出图中顶点A到顶点B的最短路径,但也顺便得到了一个有价值的副产品,就是求出了从顶点A到其他所有顶点的最短路径,因此,迪杰斯特拉算法被称为图的单源最短路径算法。

图的多源最短路径

弗洛伊德算法,专门用于寻找图的多源最短路径。

小结

图是一种多对多的数据结构,最基本的单元是顶点,顶点之间由边关联;

无权图的边没有权重概念;带权图的每一条边拥有自己的权重;

无向图的顶点关联是对称的;有向图的顶点关联不完全对称,顶点A触达顶点B,顶点B未必触达顶点A;

图的主要存储方式包括邻接矩阵和邻接表/逆邻接表;

图的遍历方式,分为深度优先遍历和广度优先遍历;

寻找图的单源最短路径,可以使用迪杰斯特拉(Dijkstra)算法;寻找图的多源最短路径,可以使用弗洛伊德(Floyd)算法




《漫画算法2:小灰的算法接近》第三章 图的评论 (共 条)

分享到微博请遵守国家法律