在本教程中,您将学习什么是图数据结构。 此外,您还将找到图的表示形式。
图数据结构是具有数据并连接到其他节点的节点的集合。
让我们尝试通过一个例子来理解这一点。 在 facebook 上,一切都是节点。 包括用户,照片,相册,事件,组,页面,评论,故事,视频,链接,注释…任何有数据的都是节点。
每个关系都是从一个节点到另一个节点的一条边。 无论您发布照片,加入群组(如页面等),都会为该关系创建新的边。
图数据结构示例
然后,所有的 facebook 都是这些节点和边的集合。 这是因为 facebook 使用图数据结构来存储其数据。
更准确地说,图是一种数据结构(V, E)
,由
- 顶点
V
的集合 - 边
E
的集合,表示为有序的顶点对(u, v)
顶点和边
在图中,
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
的边。
我们上面创建的图的邻接矩阵是
图邻接矩阵
由于它是无向图,因此对于边(0, 2)
,我们还需要标记边(2, 0)
; 使邻接矩阵关于对角线对称。
在邻接矩阵表示中,边查找(检查顶点A
和顶点B
之间是否存在边)非常快,但是我们必须为所有顶点之间的每个可能链接保留空间(V x V)
,因此需要更多空间。
2.邻接表
邻接列表将图表示为链表的数组。
数组的索引表示一个顶点,而其链表中的每个元素表示与该顶点形成边的其他顶点。
我们在第一个示例中创建的图的邻接列表如下:
邻接表表示
邻接表在存储方面非常有效,因为我们只需要存储边的值即可。 对于具有数百万个顶点的图,这可能意味着节省了很多空间。
图的操作
最常见的图操作是:
- 检查图中是否存在该元素
- 图的遍历
- 向图添加元素(顶点,边)
- 寻找从一个顶点到另一个顶点的路径