Way*_*rad 24
这是在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
Run Code Online (Sandbox Code Playgroud)
每个节点都维护对其后继者的引用.不知道你需要什么样的操作,我没有定义任何实际进行图遍历的操作,但每个节点都有对其后继者的引用,这使得遍历图表变得微不足道.
现在我们将创建一个表示整个图形的类:
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
Run Code Online (Sandbox Code Playgroud)
此类保留其节点的哈希值,按名称键入.这使得特定节点的检索变得容易.
以下是包含循环的图表示例:
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]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4463 次 |
| 最近记录: |