Java Graph

2025年5月2日 | 阅读 11 分钟

在 Java 中,**图**是一种存储一定数据的结构。**图**的概念源自数学,能够满足计算机科学领域的需求。它表示连接多个点的网络。在本节中,我们将详细学习 Java 图数据结构。此外,我们还将学习**图的类型**、它们的实现以及图的**遍历**。

Graph

**图**是一种存储连接数据的数据结构。换句话说,图 G (或 g) 被定义为一组顶点 (V) 和连接顶点的边 (E)。图的例子有社交网络、计算机网络、谷歌地图等。

每个图由**边**和**顶点**(也称为节点)组成。每个顶点和边都有关系。其中顶点表示数据,边表示它们之间的关系。顶点用带标签的圆圈表示。边用连接节点的线表示(顶点)。

图术语

**顶点:** 顶点是连接边的点。它代表数据。它也称为节点。它用圆圈表示,并且必须带标签。要构建一个图,至少需要一个节点。例如,房屋、公交车站等。

**边:** 边是连接两个顶点的线。它表示顶点之间的关系。边用线表示。例如,从你家到公交车站的路。

**权重:** 它是加在边上的标签。例如,两座城市之间的距离是 100 公里,那么距离就是边的权重。

**路径:** 路径是从初始点到目标点的顺序到达方式。

图的类型

  • **带权图:** 在带权图中,每条边都包含一些**数据**(权重),如距离、重量、高度等。它表示为 w(e)。它用于计算从一个顶点到另一个顶点的遍历成本。下图表示一个带权图。
    Java Graph
  • **无权图:** 边不与任何值关联的图称为无权图。下图表示一个无权图。
    Java Graph
  • **有向图:** 边表示方向的图称为有向图。在有向图中,我们使用箭头而不是线条(边)。方向表示从一个节点到另一个节点的路径。请注意,在有向图中,我们可以朝一个方向或两个方向移动。下图表示一个有向图。
    Java Graph
  • **无向图:** 边是双向的图称为无向图。在无向图中,我们可以朝任何方向遍历。请注意,我们可以使用与来时相同的路径返回。而在有向图中,我们不能通过相同的路径返回。
    Java Graph
  • **连通图:** 如果任意两个顶点之间都存在至少一条路径,则称该图为连通图。请注意,只有一个顶点的图是连通图。
    Java Graph
    连通图有两种类型。
    1. **弱连通图:** 无法通过单条路径访问节点的图称为弱连通图。
      Java Graph
    2. **强连通图:** 可以通过单条路径访问节点的图称为强连通图。
      Java Graph
  • **不连通图:** 如果任意两个顶点之间不存在路径,则该图称为不连通图。不连通图可能由两个或多个连通图组成。
    Java Graph
  • **多重图:** 连接同一对节点的多条边的图。下图表示一个多重图。
    Java Graph
  • **稠密图:** 边数接近最大可能边数的图称为稠密图。下图表示一个稠密图。
    Java Graph
  • **稀疏图:** 边数接近最小可能边数的图称为稀疏图。它可以是不连通图。下图表示一个稀疏图。
    Java Graph

Java 图实现

要在 Java 中实现图,我们将使用 泛型类。要创建 Java 泛型类的对象,我们使用以下语法

请记住,我们不能将原始类型用作参数类型。

让我们创建一个实现图的 Java 程序。

GraphImplementation.java

输出

Java Graph

有向图实现

DirectedGraph.java

输出

Java Graph

带权图实现

WeightedGraph.java

输出

Java Graph

图遍历

图的遍历是指至少访问一次每个顶点和边。为了遍历图,图数据结构提供了两种算法

  • 深度优先搜索 (DFS)
  • 广度优先搜索 (DFS)

深度优先搜索 (DFS)

DFS 算法是一种基于回溯概念的递归算法。该算法从初始节点开始,并深入搜索,直到找到目标节点(一个没有子节点的节点)。回溯允许我们在向前遍历的同一条路径上向后移动。

让我们在 Java 程序中实现 DFS 算法。

DepthFirstSearch.java

输出

Java Graph

广度优先搜索 (BFS)

BFS 算法是遍历图最常见的方法。遍历从源节点开始,并扫描其邻居节点(当前节点的子节点)。简而言之,水平遍历并访问当前层的所有节点。然后,移动到下一层并执行相同的操作。

让我们在 Java 程序中实现 BFS 算法。

BreadthFirstSearch.java

输出

Java Graph