首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >邻接表和图

邻接表和图
EN

Stack Overflow用户
提问于 2012-10-04 13:26:13
回答 1查看 4.8K关注 0票数 10

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-05 23:54:47

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

代码语言:javascript
复制
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

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

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

代码语言:javascript
复制
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

这个类保存了它的节点的散列,按名称作为关键字。这使得检索特定节点变得容易。

下面是一个包含循环的图的示例:

代码语言:javascript
复制
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]
票数 24
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12720771

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档