MST

星途 面试题库

面试题:Go语言多维数组与切片结合在复杂数据结构中的应用及优化

设计一个Go语言的数据结构,该结构需要使用多维数组与切片结合来模拟一个城市交通网络,其中节点用数组表示,节点间的连接关系用切片记录权重。要求实现添加节点、添加连接、查找最短路径等功能,并说明如何对这个数据结构进行性能优化。
32.6万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

数据结构设计

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]
}

性能优化

  1. 数据结构优化
    • 可以考虑使用邻接表代替二维数组来存储边,这样在稀疏图的情况下可以节省大量空间,并且添加节点和连接的操作时间复杂度更优。对于邻接表,可以使用 map 来存储每个节点及其邻居节点和权重。
    • 节点的查找可以使用 map 来加速,避免每次添加连接和查找最短路径时遍历整个节点数组。
  2. 算法优化
    • 查找最短路径的Dijkstra算法可以使用优先队列(最小堆)来优化,这样每次选择距离源点最近的未访问节点时时间复杂度可以从 $O(V)$ 优化到 $O(\log V)$,其中 $V$ 是节点数。
  3. 内存管理
    • 及时释放不再使用的内存,例如在删除节点或连接时,要确保相关的内存空间被正确回收,避免内存泄漏。
    • 合理分配内存,例如预分配一定大小的数组或切片,减少动态内存分配的次数。