当前位置:首页 > Go > 正文

图的邻接矩阵表示(Go语言实现图数据结构的入门指南)

在计算机科学中,图(Graph)是一种非常重要的非线性数据结构,广泛应用于社交网络、路径规划、依赖关系分析等场景。今天,我们将用Go语言来实现图的一种经典表示方法——邻接矩阵。无论你是编程小白还是有一定经验的开发者,这篇教程都将帮助你轻松掌握Go语言图的邻接矩阵表示法。

什么是图?

图由顶点(Vertex)边(Edge)组成。顶点代表对象,边代表对象之间的关系。图可以是有向的(边有方向)或无向的(边无方向)。

什么是邻接矩阵?

邻接矩阵是一种用二维数组来表示图中顶点之间连接关系的方法。假设图中有 n 个顶点,那么我们就创建一个 n × n 的矩阵 matrix

  • 如果顶点 i 和顶点 j 之间有边,则 matrix[i][j] = 1(或边的权重)
  • 如果没有边,则 matrix[i][j] = 0
图的邻接矩阵表示(Go语言实现图数据结构的入门指南) Go语言图的邻接矩阵 图数据结构Go实现 邻接矩阵表示法 Go语言数据结构教程 第1张

Go语言实现邻接矩阵

下面我们用 Go 语言一步步实现一个无向图的邻接矩阵表示。

1. 定义图结构

type Graph struct {    vertices int           // 顶点数量    matrix   [][]int      // 邻接矩阵}

2. 创建新图

func NewGraph(vertices int) *Graph {    // 初始化一个 vertices × vertices 的二维切片    matrix := make([][]int, vertices)    for i := range matrix {        matrix[i] = make([]int, vertices)    }    return &Graph{        vertices: vertices,        matrix:   matrix,    }}

3. 添加边

// AddEdge 添加一条无向边func (g *Graph) AddEdge(v1, v2 int) {    if v1 < g.vertices && v2 < g.vertices {        g.matrix[v1][v2] = 1        g.matrix[v2][v1] = 1 // 无向图:对称    }}

4. 打印邻接矩阵

func (g *Graph) PrintMatrix() {    for i := 0; i < g.vertices; i++ {        for j := 0; j < g.vertices; j++ {            fmt.Printf("%d ", g.matrix[i][j])        }        fmt.Println()    }}

5. 完整示例

package mainimport "fmt"type Graph struct {    vertices int    matrix   [][]int}func NewGraph(vertices int) *Graph {    matrix := make([][]int, vertices)    for i := range matrix {        matrix[i] = make([]int, vertices)    }    return &Graph{vertices: vertices, matrix: matrix}}func (g *Graph) AddEdge(v1, v2 int) {    if v1 < g.vertices && v2 < g.vertices {        g.matrix[v1][v2] = 1        g.matrix[v2][v1] = 1    }}func (g *Graph) PrintMatrix() {    for i := 0; i < g.vertices; i++ {        for j := 0; j < g.vertices; j++ {            fmt.Printf("%d ", g.matrix[i][j])        }        fmt.Println()    }}func main() {    g := NewGraph(4) // 创建包含4个顶点的图    g.AddEdge(0, 1)    g.AddEdge(0, 2)    g.AddEdge(1, 2)    g.AddEdge(2, 3)    fmt.Println("邻接矩阵表示:")    g.PrintMatrix()}

运行上述代码,输出如下:

邻接矩阵表示:0 1 1 0 1 0 1 0 1 1 0 1 0 0 1 0

邻接矩阵的优缺点

优点:

  • 查询两个顶点是否相连的时间复杂度为 O(1)
  • 实现简单直观

缺点:

  • 空间复杂度高:O(V²),即使图很稀疏(边很少)也会浪费大量空间
  • 添加/删除顶点成本高,需要重建整个矩阵

总结

通过本教程,我们学习了如何在 Go语言 中使用 邻接矩阵 来表示图。这是理解 图数据结构Go实现 的重要一步。虽然邻接矩阵在稀疏图中效率不高,但它在稠密图或需要频繁判断边是否存在时非常有用。

如果你正在学习 Go语言数据结构教程,建议你也尝试实现 邻接表 表示法,它在大多数实际应用中更节省空间。

希望这篇关于 Go语言图的邻接矩阵 的教程对你有所帮助!动手写一写代码,你会理解得更深刻。