数据结构设计
package main
import (
"fmt"
"math"
)
// 定义节点结构体
type Node struct {
ID int
// 可以添加其他节点相关属性
}
// 定义图结构体
type Graph struct {
Nodes []Node
Edges [][]int
}
// 添加节点
func (g *Graph) AddNode(node Node) {
g.Nodes = append(g.Nodes, node)
newRow := make([]int, len(g.Nodes))
for i := range newRow {
newRow[i] = -1 // -1 表示无连接
}
g.Edges = append(g.Edges, newRow)
for i := range g.Edges {
g.Edges[i] = append(g.Edges[i], -1)
}
}
// 添加连接
func (g *Graph) AddConnection(nodeID1, nodeID2, weight int) {
index1, index2 := -1, -1
for i, node := range g.Nodes {
if node.ID == nodeID1 {
index1 = i
}
if node.ID == nodeID2 {
index2 = i
}
}
if index1 != -1 && index2 != -1 {
g.Edges[index1][index2] = weight
g.Edges[index2][index1] = weight
}
}
// 查找最短路径(使用Dijkstra算法)
func (g *Graph) ShortestPath(startID, endID int) int {
startIndex, endIndex := -1, -1
for i, node := range g.Nodes {
if node.ID == startID {
startIndex = i
}
if node.ID == endID {
endIndex = i
}
}
if startIndex == -1 || endIndex == -1 {
return -1 // 节点不存在
}
dist := make([]int, len(g.Nodes))
visited := make([]bool, len(g.Nodes))
for i := range dist {
dist[i] = math.MaxInt32
}
dist[startIndex] = 0
for i := 0; i < len(g.Nodes)-1; i++ {
minIndex := -1
minDist := math.MaxInt32
for j := 0; j < len(g.Nodes); j++ {
if!visited[j] && dist[j] < minDist {
minDist = dist[j]
minIndex = j
}
}
visited[minIndex] = true
for j := 0; j < len(g.Nodes); j++ {
if!visited[j] && g.Edges[minIndex][j] != -1 && dist[minIndex] != math.MaxInt32 && dist[minIndex]+g.Edges[minIndex][j] < dist[j] {
dist[j] = dist[minIndex] + g.Edges[minIndex][j]
}
}
}
return dist[endIndex]
}
性能优化
- 数据结构优化:
- 可以考虑使用邻接表代替二维数组来存储边,这样在稀疏图的情况下可以节省大量空间,并且添加节点和连接的操作时间复杂度更优。对于邻接表,可以使用
map
来存储每个节点及其邻居节点和权重。
- 节点的查找可以使用
map
来加速,避免每次添加连接和查找最短路径时遍历整个节点数组。
- 算法优化:
- 查找最短路径的Dijkstra算法可以使用优先队列(最小堆)来优化,这样每次选择距离源点最近的未访问节点时时间复杂度可以从 $O(V)$ 优化到 $O(\log V)$,其中 $V$ 是节点数。
- 内存管理:
- 及时释放不再使用的内存,例如在删除节点或连接时,要确保相关的内存空间被正确回收,避免内存泄漏。
- 合理分配内存,例如预分配一定大小的数组或切片,减少动态内存分配的次数。