图数据结构

/graph

在本教程中,您将学习什么是图数据结构。 此外,您还将找到图的表示形式。

图数据结构是具有数据并连接到其他节点的节点的集合。

让我们尝试通过一个例子来理解这一点。 在 facebook 上,一切都是节点。 包括用户,照片,相册,事件,组,页面,评论,故事,视频,链接,注释...任何有数据的都是节点。

每个关系都是从一个节点到另一个节点的一条边。 无论您发布照片,加入群组(如页面等),都会为该关系创建新的边。

graph data structure explained using facebook's example. Users, groups, pages, events, etc. are represented as nodes and their relationships - friend, joining a group, liking a page are represented as links between nodes

图数据结构示例

然后,所有的 facebook 都是这些节点和边的集合。 这是因为 facebook 使用图数据结构来存储其数据。

更准确地说,图是一种数据结构(V, E),由

  • 顶点V的集合
  • E的集合,表示为有序的顶点对(u, v)

a graph contains vertices that are like points and edges that connect the points

顶点和边

在图中,

V = {0, 1, 2, 3}
E = {(0,1), (0,2), (0,3), (1,2)}
G = {V, E}

图的术语

  • 相邻:如果存在一条连接顶点的边,则该顶点被称为与另一个顶点相邻。 顶点 2 和 3 不相邻,因为它们之间没有边。
  • 路径:一条允许您从顶点A到顶点B的边序列称为路径。 0-1、1-2 和 0-2 是从顶点 0 到顶点 2 的路径。
  • 有向图:其中边(u, v)不一定意味着也有边(v, u)的图。 该图中的边由箭头表示,以显示边的方向。

图的表示

图通常以两种方式表示:

1.邻接矩阵

邻接矩阵是V x V顶点的 2D 数组。 每行和每列代表一个顶点。

如果任何元素a[i][j]的值为 1,则表示存在连接顶点i和顶点j的边。

我们上面创建的图的邻接矩阵是

graph adjacency matrix for sample graph shows that the value of matrix element is 1 for the row and column that have an edge and 0 for row and column that don't have an edge

图邻接矩阵

由于它是无向图,因此对于边(0, 2),我们还需要标记边(2, 0); 使邻接矩阵关于对角线对称。

在邻接矩阵表示中,边查找(检查顶点A和顶点B之间是否存在边)非常快,但是我们必须为所有顶点之间的每个可能链接保留空间(V x V),因此需要更多空间。

2.邻接表

邻接列表将图表示为链表的数组。

数组的索引表示一个顶点,而其链表中的每个元素表示与该顶点形成边的其他顶点。

我们在第一个示例中创建的图的邻接列表如下:

adjacency list representation represents graph as array of linked lists where index represents the vertex and each element in linked list represents the edges connected to that vertex

邻接表表示

邻接表在存储方面非常有效,因为我们只需要存储边的值即可。 对于具有数百万个顶点的图,这可能意味着节省了很多空间。


图的操作

最常见的图操作是:

  • 检查图中是否存在该元素
  • 图的遍历
  • 向图添加元素(顶点,边)
  • 寻找从一个顶点到另一个顶点的路径