数据结构-图

怎么理解”图”

图是是一种复杂的非线性结构。图中的每一个元素叫做顶点(vertex), 图中就有六个顶点。图中每一个一个顶点可以与任意其他顶点建立连接关系。这种建立的关系叫做边(edge)。

以微信好友举例,把每个用户看作一个顶点。如果两个用户之间互加好友,那就在两者之间建立一条边。所以,整个微信的好友关系就可以用一张图来表示。其中,每个用户有多少个好友,对应到图中,就叫做顶点的度(degree),度就是跟顶点相连接的边的条数。 图中 1 定点的度就是 3。

这种边没有方向图的叫做“无向图”,边有方向的叫做“有向图”。

微博关注举例。如果用户 1 关注了用户 2,就在图中画一条从 1 到 2 的带箭头的边,用户 3 和用户 5 互相关注了,就画一条从 3 指向 5 的边,再画一条从 5 指向 3 的边。

邻接矩阵

邻接矩阵是一种存储图的数据格式,它可以用来表示有限的图。邻接矩阵底层就是一个二维数组。

  1. 对于无向图来说,如果顶点 i 与顶点 j 之间有边,就将 A[i][j]和 A[j][i]标记为 1。
  2. 对于有向图来说,如果顶点 i 到顶点 j 之间,有一条箭头从顶点 i 指向顶点 j 的边,那就将 A[i][j]标记为 1。如果有一条箭头从顶点 j 指向顶点 i 的边,就将 A[j][i]标记为 1。

无向图的邻接矩阵是对称矩阵,非常浪费内存, 因为无向图来说,如果 A[i][j]等于 1,那 A[j][i]也肯定等于 1。但是邻接矩阵对于边的存储、查询、更新等操作效率非常高。

邻接表

在邻接表中每个顶点对应一条链表,链表中存储的是与这个顶点相连接的其他顶点。

邻接矩阵存储起来比较浪费空间,但是使用起来比较节省时间。相反,邻接表存储起来比较节省空间,但是使用起来就比较耗时间。

在一个邻接表中,给定一个顶点,可以很容易地找出它的所有邻边,因为只需要读取它的邻接表就可以了。在一个邻接矩阵中,相同的操作则需要扫描一行,花费O(n)时间。而如果想知道给定的两个顶点间是否存在有边,在邻接矩阵里可以立刻查到,在邻接表中则需要花费以边的最小关联度成比例的时间。


数据结构-图
http://example.com/posts/41634.html
作者
她微笑的脸y
发布于
2022年10月13日
许可协议