我是一个新的Go程序员,几天前刚刚完成了"Go 之旅"教程。我想创建一个 150 x 120 大小的图,然后获取每个节点的所有边缘节点,并实现一些图搜索算法,如 BFS 和 Dijkstra。我找到了一个名为 Gonum 的漂亮库,其中包含一个看起来很有希望使用的图形包。
我的问题是它有很多信息,我不知道从哪里开始。我希望能有某种教程让我朝着正确的方向开始,但我没有任何运气找到一个。
我在 Python 中设置它的方式是制作一个零的 numpy 数组来表示图形的大小,然后遍历它以获得每个节点的每个边,但我不确定这是考虑如何在 Go 中设置图形的最佳方式。
如果你刚开始使用 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
}
<</div>
div class="one_answers"> 偶然发现了这个问题,寻找用 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()))