1

我是一名新的 Go 程序员,几天前刚刚完成了“Go 之旅”教程。我想创建一个 150 x 120 大小的图,然后获取每个节点的所有边缘节点并实现一些图搜索算法,例如 BFS 和 Dijkstra。我发现了一个很棒的库,叫做 Gonum,它带有一个 看起来很有希望使用的图形包。

我的问题是它有很多信息,我不知道从哪里开始。我希望有某种教程可以让我朝着正确的方向开始,但我没有找到一个。

我在 Python 中设置的方法是制作一个零的 numpy 数组来表示图形的大小,然后遍历它以获得每个节点的每条边,但我不确定这是思考如何图表是在 Go 中设置的。

4

2 回答 2

2

如果您刚开始使用 Go,我建议您稍微坚持使用标准库,而不是在您的学习曲线上增加更多内容。尝试使用一些基本算法来实现一个简单的图形数据结构——这很容易,并且可以让你练习该语言。稍后当您需要更多性能/功能时,您可以四处寻找库(gonum 或其他)。例如,一个简单的图形可以表示为:

// Node is a node in the graph; it has a (unique) ID and a sequence of
// edges to other nodes.
type Node struct {
    Id    int64
    Edges []int64
}

// Graph contains a set of Nodes, uniquely identified by numeric IDs.
type Graph struct {
    Nodes map[int64]Node
}
于 2019-01-19T17:49:05.763 回答
0

偶然发现了这个问题,寻找使用 gonum/graph 计算边的提示。除了挖掘 API 文档之外,我还没有找到大量资源。

认为我找到了计算单个节点边缘的正确方法..也许!

for _, node := range graph.NodesOf(g.Nodes()) {
    toNodes := g.From(node.ID()) // returns graph.Nodes
    nodeArray := graph.NodesOf( toNodes ) // returns []graph.Node
    edgeCount := len(nodeArray)
    // - or -
    edgeCount := len(graph.NodesOf( g.From(node.ID()) ))
    // do work with edge count
}

给定一个已知节点以及您可以从那里到达的所有节点,您可以计算(例如:len(graph.NodesOf(g.From(node.ID())))边的数量!

要计算所有边:

totalEdges := len(graph.EdgesOf(g.Edges()))
于 2020-12-15T04:32:52.343 回答