gpt4 book ai didi

ruby - 邻接表和图

转载 作者:数据小太阳 更新时间:2023-10-29 06:45:24 24 4
gpt4 key购买 nike

我正在尝试通过邻接列表构建一个图,这意味着我需要一个包含所有节点的列表,并且在每个节点类中,我还需要一个数据结构来保存所有相邻节点。只是想知道执行此操作的最佳结构是什么(快速搜索目标节点类)。数组行得通吗?

最佳答案

这是在 Ruby 中构建有向图的一种方法,其中每个节点都维护对其后继节点的引用,但可以通过名称引用节点。首先,我们需要一个节点类:

class Node

attr_reader :name

def initialize(name)
@name = name
@successors = []
end

def add_edge(successor)
@successors << successor
end

def to_s
"#{@name} -> [#{@successors.map(&:name).join(' ')}]"
end

end

每个节点都维护对其后继节点的引用。不知道你需要什么样的操作,我没有定义任何实际进行图形遍历的操作,但是每个节点都引用了它的后继节点使得遍历图形变得微不足道。

现在我们将创建一个类来表示整个图:

class Graph

def initialize
@nodes = {}
end

def add_node(node)
@nodes[node.name] = node
end

def add_edge(predecessor_name, successor_name)
@nodes[predecessor_name].add_edge(@nodes[successor_name])
end

def [](name)
@nodes[name]
end

end

此类保留其节点的散列,按名称键控。这使得特定节点的检索变得容易。

这是一个包含循环的图形示例:

graph = Graph.new
graph.add_node(Node.new(:a))
graph.add_node(Node.new(:b))
graph.add_node(Node.new(:c))
graph.add_edge(:a, :b)
graph.add_edge(:b, :c)
graph.add_edge(:c, :a)
puts graph[:a] #=> a -> [b]
puts graph[:b] #=> b -> [c]
puts graph[:c] #=> c -> [a]

关于ruby - 邻接表和图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12720771/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com