使用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結構體。
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP