【问题标题】:Ruby - Graph adjacency matrix into variableRuby - 将邻接矩阵图形化为变量
【发布时间】:2014-06-02 18:13:03
【问题描述】:

我正在尝试编辑找到here 的算法。

我希望从文件中加载邻接矩阵(文件的格式对我来说并不重要,它可以是这样的[0,1,1,0] 或只是0110)和G = file.read().split("\n")

但是,我收到错误 no implicit conversion of Fixnum into String (TypeError) 而且我已经知道我需要将此字符串转换为整数,但如何正确执行才能不丢失此 DFS 方法所需的格式?

我想这很容易,但我是 Ruby(和图形:v)的初学者,无法让它工作......

编辑: 所以我用来从文件读取到数组数组的代码是:

def read_array(file_path)
  File.foreach(file_path).with_object([]) do |line, result|
    result << line.split.map(&:to_i)
  end
end

以及我从文件中得到的结果(例如)

01101010
01010101
01010110
10101011
01011111

这是:

=> [[[1101010], [1010101], [1010110], [10101011], [1011111]]]

然而,我需要的是:

=> [[[1,1,0,1,0,1,0], [1,0,1,0,1,0,1], [1,0,1,0,1,1,0], [1,0,1,0,1,0,1,1], [1,0,1,1,1,1,1]]]

这样它就可以与我帖子第一行中提到的算法一起使用(我会在这里复制它,如果它占用太多地方我可以删除它并只留下链接):

G = [0,1,1,0,0,1,1], # A
[1,0,0,0,0,0,0],
[1,0,0,0,0,0,0],
[0,0,0,0,1,1,0],
[0,0,0,1,0,1,1],
[1,0,0,1,1,0,0],
[1,0,0,0,1,0,0] # G

LABLES = %w(A B C D E F G)

def dfs(vertex)

  print "#{LABLES[vertex]} " # visited

  edge = 0
  while edge < G.size
    G[vertex][edge] = 0
    edge += 1
  end

  edge = 0
  while edge < G.size
    if ( G[edge][vertex] != 0 && edge != vertex)
      dfs(edge)
    end
    edge += 1
  end
end

dfs(0)

【问题讨论】:

  • 您需要提供有关您正在尝试做的事情、您期望发生的事情以及您实际看到的内容的更多详细信息。你能提供一个产生错误的最小代码示例吗?
  • @matt 所以我编辑了帖子,如果我省略了其他内容,请告诉我。基本上我只希望这段代码可以处理从文件加载的任何图形邻接矩阵,而不是硬编码到 .rb 文件中。哦,当我尝试加载包含我想要的“G”的文件时收到的错误。
  • 您显示的结果是一个包含单个数组的数组,该数组包含多个数组。这是对的还是错字?换句话说,它应该是[[1101010], ... [1011111]] 而不是[[[1101010], ... [1011111]]]
  • @matt 我错过了 - 但它实际打印的是 [[[101010], ...]]],我猜应该是 [[101010], ... ]],所以我可以简单地将它与提到的功能一起使用。
  • 您显示的方法在单独包装的数组中产生结果。您必须将结果包装在另一个数组中。

标签: ruby arrays string algorithm


【解决方案1】:

split 的默认分隔符是空格。要使其拆分每个字符,您需要明确地说出来:

'01101101'.split.map(&:to_i)
# => [ 1101101 ]
'01101101'.split('').map(&:to_i)
# => [ 0, 1, 1, 0, 1, 1, 0, 1 ]

您也可以使用chars 来完成同样的工作:

'01101101'.chars.map(&:to_i)
# => [ 0, 1, 1, 0, 1, 1, 0, 1 ]

不知道你的read_array是怎么用的,不过可以简化为:

def read_array(file_path)
  File.foreach(file_path).map do |line|
    line.chomp.chars.map(&:to_i)
  end
end

read_array('my_file.txt')
# => [[1, 1, 0, 1, 0, 1, 0], [1, 0, 1, 0, 1, 0, 1], [1, 0, 1, 0, 1, 1, 0], [1, 0, 1, 0, 1, 0, 1, 1], [1, 0, 1, 1, 1, 1, 1]]

如果你仍然得到额外的[,你可以只拿第一项:

my_array[0]

或者(如果 uber-array 有多个项目)- 使用 flat_map:

uber_array = [[[1, 0, 1, 0, 1, 0, 1], [1, 0, 1, 0, 1, 1, 0], [1, 0, 1, 0, 1, 0, 1, 1]],
             [[1, 0, 1, 0, 1, 0, 1, 1], [1, 0, 1, 1, 1, 1, 1]]]

uber_array.flat_map { |a| a }
# => [[1, 0, 1, 0, 1, 0, 1], [1, 0, 1, 0, 1, 1, 0], [1, 0, 1, 0, 1, 0, 1, 1], [1, 0, 1, 0, 1, 0, 1, 1], [1, 0, 1, 1, 1, 1, 1]]

【讨论】:

  • 我仍然得到 [[[ 而不是 [[ 开始和结束括号。有什么办法可以解决吗?将它与我的 DFS 算法一起使用时,它只打印两个顶点
  • 真的很抱歉,我的错误 - 我一直在使用已输入逗号和括号的 .txt 文件 - 使用像这样 @ 格式的文件时无需删除额外的括号987654335@
猜你喜欢
  • 1970-01-01
  • 2021-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多