企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# 图数据结构 > 原文: [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](https://img.kancloud.cn/1a/d0/1ad0d5d577b3d459f77acd990374f415_1460x704.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](https://img.kancloud.cn/c6/18/c6183555b6d23e5d09956bf639e885b6_1460x484.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](https://img.kancloud.cn/c7/37/c7372a4ef30dae22db0489e12d42c186_1460x610.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](https://img.kancloud.cn/05/27/052729a413915cded0703fdda6b84517_1460x608.png "Adjacency list representation") 邻接表表示 邻接表在存储方面非常有效,因为我们只需要存储边的值即可。 对于具有数百万个顶点的图,这可能意味着节省了很多空间。 * * * ## 图的操作 最常见的图操作是: * 检查图中是否存在该元素 * 图的遍历 * 向图添加元素(顶点,边) * 寻找从一个顶点到另一个顶点的路径