我是一名新的Go程序员,几天前刚刚完成了“ A Go of Go”教程。我想创建一个150 x 120大小的图形,然后获取每个节点的所有边缘节点,并实现一些图形搜索算法,例如BFS和Dijkstra。我发现了一个外观漂亮的Gonum库,它带有一个graph package,看起来很有希望使用。
我的问题是,这里有很多信息,我不知道从哪里开始。我希望会有某种教程使我朝正确的方向开始,但是我没有运气找到一个。
我在Python中进行设置的方式是创建一个零的numpy数组来表示图形的大小,然后对其进行迭代以获取每个节点的每个边,但是我不确定这是否是最好的方法考虑一下如何在Go中设置图表。
答案 0 :(得分:1)
如果您只是刚开始使用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
}
答案 1 :(得分: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()))