📜  数据结构-图表示(1)

📅  最后修改于: 2023-12-03 15:26:09.226000             🧑  作者: Mango

数据结构-图表示

什么是图

在计算机科学中,图(Graph)是一种非线性的数据结构,它由节点(Node)和边(Edge)组成。图的节点通常表示某个对象或实体,而边则表示节点之间的关系或连接。图可以用于表示现实中的各种关系,如社交网络中的人与人之间的关系、道路地图中城市和道路之间的关系等等。

图的表示

图的表示有两种常用方式,邻接矩阵和邻接表。邻接矩阵是用一个二维数组来表示,数组的下标代表节点,数组元素的值代表两个节点之间是否有边相连。邻接表则是用一个链表数组来表示,数组的下标同样代表节点,数组元素是一个链表,链表中存储了所有与该节点相连的节点。

邻接矩阵

邻接矩阵可以用一个二维数组表示,如下所示:

    A   B   C   D
A   0   1   1   0
B   1   0   0   1
C   1   0   0   1
D   0   1   1   0

在以上示例中,节点 A 和节点 B 之间有一条边,因此矩阵中 (A, B) 和 (B, A) 的值均为 1。节点 A 和节点 D 之间没有边,因此矩阵中 (A, D) 和 (D, A) 的值均为 0。

邻接表

邻接表是用一个数组来表示,每个数组元素都是一个链表。链表中的节点代表当前节点所连接的另一个节点信息。

举个例子,用邻接表表示一个图:

     A---B---C
     |   |
     D---E

邻接表可以表示为:

A -> B -> D
B -> A -> C -> E
C -> B
D -> A -> E
E -> B -> D

以上示例中,节点 A 的邻接表中依次存储了节点 B 和节点 D 的信息。

图的遍历

图的遍历是指按照某种顺序依次访问图中的所有节点。常用的图遍历算法有深度优先遍历和广度优先遍历。

深度优先遍历

深度优先遍历(Depth First Search,DFS)是一种先访问深层节点再回溯访问浅层节点的遍历方式。简单来说,就是从一个节点开始遍历,先访问它的一个邻接节点,然后继续深层遍历该邻接节点的邻接节点,直到没有未访问的邻接节点为止。

广度优先遍历

广度优先遍历(Breadth First Search,BFS)是一种先访问浅层节点再逐层访问深层节点的遍历方式。简单来说,就是从一个节点开始遍历,先访问它的所有邻接节点,然后按照一定顺序(通常是按照和当前节点的距离从小到大的顺序)逐步访问深层的节点。

图的常用算法

图在计算机科学中的应用非常广泛,常用的算法如下:

  • 最短路径算法:Dijkstra算法、Floyd算法
  • 最小生成树算法:Kruskal算法、Prim算法
  • 拓扑排序算法
  • 连通性算法:连通性问题通常可以用深度优先搜索或广度优先搜索来解决
  • 强联通分量算法:Tarjan算法、Kosaraju算法
总结

图是一种非常重要的数据结构,它可以用于表示现实中的各种实体和关系。我们可以使用邻接矩阵或邻接表来表示图,并使用深度优先遍历或广度优先遍历来遍历图。在实际应用中,我们还可以使用各种算法来解决各种问题,例如最短路径、最小生成树等问题。