使用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+ 次瀏覽

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.