将邻接矩阵转换为邻接列表以表示图

时间:2020-07-29 01:40:12

标签: ruby

我正在尝试在Ruby中编写代码,以将给定图的邻接矩阵转换为邻接列表。当我针对提到的here验证给定输入的解决方案时,我的输出略有不同。我需要一些方向来理解问题到底在哪里。下面是我的代码:

def convert_adj_matrix_to_list(arr)
  
  list = {}

  start = 0
  last = 0
  
  arr.each_index do |row|
    # row = [0, 0, 1]
    puts "row = #{arr[row]}"
      
    for col in 0..arr[row].size-1
      puts "row = #{row}, col = #{col}"
      puts "arr[#{row}][#{col}] = #{arr[row][col]}"
      list[row] = col if arr[row][col] == 1
    end
    puts
  end

  list
  
end
arr = [ [0, 0, 1], [0, 0, 1], [1, 1, 0] ]

puts convert_adj_matrix_to_list(arr)

输出:

row = [0, 0, 1]
row = 0, col = 0
arr[0][0] = 0
row = 0, col = 1
arr[0][1] = 0
row = 0, col = 2
arr[0][2] = 1

row = [0, 0, 1]
row = 1, col = 0
arr[1][0] = 0
row = 1, col = 1
arr[1][1] = 0
row = 1, col = 2
arr[1][2] = 1

row = [1, 1, 0]
row = 2, col = 0
arr[2][0] = 1
row = 2, col = 1
arr[2][1] = 1
row = 2, col = 2
arr[2][2] = 0

{0=>2, 1=>2, 2=>1}

1 个答案:

答案 0 :(得分:3)

在这样的函数中进行打印是side effect,并且仅应在调试时进行。最好在呼叫者中打印。

从逻辑上讲,您的代码仅跟踪矩阵中最后看到的链接,并返回将int映射到int的哈希,而不是将int映射到int数组的哈希。

您可以通过映射每行,然后根据单元格是否具有值1来过滤行的索引来获取哈希。一旦构建了二维数组对,其中对中的第一项是源节点整数一对中的第二项是其到其他节点的边的数组,请在其上调用.to_h以产生哈希。

def adj_matrix_to_list(matrix)
  matrix.each_with_index.map do |row, i|
    [i, row.each_index.select {|j| row[j] == 1}]
  end.to_h
end

matrix = [[0, 0, 1], 
          [0, 0, 1], 
          [1, 1, 0]]
p adj_matrix_to_list(matrix) # {0=>[2], 1=>[2], 2=>[0, 1]}

前面已经说过,使用键0、1、2 ... n的哈希值是一种反模式,因为数组是一种表示顺序索引的事物列表的更快,更自然的方法。我会的:

def adj_matrix_to_list(matrix)
  matrix.map do |row|
    row.each_index.select {|i| row[i] == 1}
  end
end

matrix = [[0, 0, 1], 
          [0, 0, 1], 
          [1, 1, 0]]
p adj_matrix_to_list(matrix) # [[2], [2], [0, 1]]

和用法与哈希版本相同。