使用Go语言实现图数据结构


在Go编程语言中,图是一种数据结构,由有限数量的节点(也称为顶点)和连接它们的边组成。图可以表示多个实体之间的关系。它可以使用不同的数据结构来表示,例如邻接矩阵或邻接表。使用的具体数据结构将取决于具体的用例和应用程序的需求。也可以使用go-graph之类的库或包在Go中实现图。这里我们将使用两种方法来实现图数据结构。

方法一:使用邻接矩阵

在这个实现中,图表示为Graph结构中的AdMatrix字段。矩阵的大小由N值决定,N表示图中节点的数量。矩阵的true值用于表示图的边。

算法

  • 步骤1 − 创建一个名为main的包,并在程序中声明fmt(格式化包),其中main生成可执行代码,fmt帮助格式化输入和输出。

  • 步骤2 − 定义一个名为Graph的结构体,其中包含一个AdMatrix字段,用于将图存储为二维矩阵。

  • 步骤3 − 下一步,创建一个Graph结构体的实例来表示图。

  • 步骤4 − 通过将AdMatrix中的单元格值设置为true,可以连接图中的节点。这是图中两个节点之间的一条边。

  • 步骤5 − 对图中的每条边重复步骤3。

  • 步骤6 − 通过遍历AdMatrix并打印其值来创建图。

  • 步骤7 − 此方法使用邻接矩阵创建图的基本表示。它可以扩展以包含更多功能,例如添加和删除节点或边,确定两个节点之间的最短路径等等。

示例

在下面的示例中,我们将使用邻接矩阵在Go编程语言中实现图数据结构。

package main
import (
   "fmt"
)

const n = 4

// Graph represents a graph using an adjacency matrix
type Graph struct {
   AdMatrix [n][n]bool
}

func main() {
   // Create graph
   graph := Graph{}

   // Connect nodes
   graph.AdMatrix[0][1] = true
   graph.AdMatrix[0][2] = true
   graph.AdMatrix[1][2] = true

   // Print graph
   fmt.Println("The graph is printed as follows using adjacency matrix:")
   fmt.Println("Adjacency Matrix:")
   for i := 0; i < n; i++ {
      for j := 0; j < n; j++ {
         fmt.Printf("%t ", graph.AdMatrix[i][j])
      }
      fmt.Println()
   }
}

输出

The graph is printed as follows using adjacency matrix:
Adjacency Matrix:
false true true false 
false false true false 
false false false false 
false false false false 

方法二:使用Node结构体

在这个例子中,我们将使用node结构体来实现图数据结构。结果将在控制台上打印一个图。让我们通过代码和算法来理解这个概念。

语法

func append(slice, element_1, element_2…, element_N) []T

append函数用于向数组切片添加值。它接受多个参数。第一个参数是要添加值的数组,后面跟着要添加的值。然后,该函数返回包含所有值的最终数组切片。

算法

  • 步骤1 − 创建一个名为main的包,并在程序中声明fmt(格式化包),其中main生成可执行代码,fmt帮助格式化输入和输出。

  • 步骤2 − 创建一个名为Node的结构体来表示图中的节点,该结构体具有两个字段:一个value字段用于保存节点的值,以及一个edges字段用于保存指向附近节点的指针切片。

  • 步骤3 − 为Node结构体创建Add_Edge方法,用于向节点添加新的边。

  • 步骤4 − 下一步,创建Node结构体的实例来表示图中的节点。

  • 步骤5 − 使用Add_Edge函数在节点之间添加边。

  • 步骤6 − 通过遍历节点并打印它们相关的节点的值,可以显示图。

  • 步骤7 − 在图的邻接表表示中,每个节点都存储其邻居的列表。Add_Edge方法将新节点添加到当前节点的edges切片中,从而在两个节点之间形成有向边。

  • 步骤8 − 使用getNodeValues方法将节点指针切片转换为节点值切片以进行显示。

示例

在这个例子中,我们将使用node结构体来执行程序。

package main
import (
   "fmt"
)

// Node represents a node in the graph.
type Node struct {
   value int
   edges []*Node
}

// AddEdge adds a new edge to the node.
func (n *Node) Add_Edge(node *Node) {
   n.edges = append(n.edges, node)
}

func main() {
   // Create nodes.
   n1 := &Node{value: 10}
   n2 := &Node{value: 20}
   n3 := &Node{value: 30}
   n4 := &Node{value: 40}
   n5 := &Node{value: 50}

   // Add edges.
   n1.Add_Edge(n2)
   n1.Add_Edge(n3)
   n2.Add_Edge(n4)
   n2.Add_Edge(n5)
   n3.Add_Edge(n5)

   // Display the graph.
   fmt.Println("The Graph is represented as:")
   fmt.Printf("Node %d -> %v\n", n1.value, getNodeValues(n1.edges))
   fmt.Printf("Node %d -> %v\n", n2.value, getNodeValues(n2.edges))
   fmt.Printf("Node %d -> %v\n", n3.value, getNodeValues(n3.edges))
   fmt.Printf("Node %d -> %v\n", n4.value, getNodeValues(n4.edges))
   fmt.Printf("Node %d -> %v\n", n5.value, getNodeValues(n5.edges))
}

// returns a slice of node values.
func getNodeValues(nodes []*Node) []int {
   var values []int
   for _, node := range nodes {
      values = append(values, node.value)
   }
   return values
}

输出

The Graph is represented as:
Node 10 -> [20 30]
Node 20 -> [40 50]
Node 30 -> [50]
Node 40 -> []
Node 50 -> []

结论

我们通过两个例子执行了实现图数据结构的程序。在第一个例子中,我们使用邻接矩阵来实现图数据结构,在第二个例子中,我们使用了node结构体。

更新于:2023年2月21日

2K+ 次浏览

开启你的职业生涯

完成课程获得认证

开始学习
广告