# 图数据结构

> 原文： [https://www.programiz.com/dsa/graph](https://www.programiz.com/dsa/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](img/85cd94ece58965f7646c95b7496418ba.png "Example of graph data structure")

图数据结构示例



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

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

*   顶点`V`的集合
*   边`E`的集合，表示为有序的顶点对`(u, v)`

![a graph contains vertices that are like points and edges that connect the points](img/abf9b1eff586dcbc635ccd0aedc5d1c0.png "Vertices and edges")

顶点和边



在图中，

```
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](img/770a8f4913ca61c9bbb1de31b7f97dad.png "Graph adjacency matrix")

图邻接矩阵



由于它是无向图，因此对于边`(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](img/a0cdb21344c49353e73743f80fe28594.png "Adjacency list representation")

邻接表表示



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

* * *

## 图的操作

最常见的图操作是：

*   检查图中是否存在该元素
*   图的遍历
*   向图添加元素（顶点，边）
*   寻找从一个顶点到另一个顶点的路径