【问题标题】:How do I make a path out of a hash?如何从哈希中创建路径?
【发布时间】:2013-09-07 22:37:16
【问题描述】:

我正在尝试定位地图最短路径的路线(具有权重/距离的连接节点)。

假设我有一个这样的哈希:

{"A"=>{"B"=>1, "E"=>1}, "B"=>{"A"=>1, "C"=>1, "F"=>1}, "C"=>{"B"=>1, "D"=>1, "G"=>1}, "D"=>{"C"=>1, "H"=>1}, "E"=>{"F"=>1, "A"=>1, "I"=>1}, "F"=>{"E"=>1, "G"=>1, "B"=>1, "J"=>1}, "G"=>{"F"=>1, "H"=>1, "C"=>1, "K"=>1}, "H"=>{"G"=>1, "D"=>1, "L"=>1}, "I"=>{"J"=>1, "E"=>1, "M"=>1}, "J"=>{"I"=>1, "K"=>1, "F"=>1, "N"=>1}, "K"=>{"J"=>1, "L"=>1, "G"=>1, "O"=>1}, "L"=>{"K"=>1, "H"=>1, "P"=>1}, "M"=>{"N"=>1, "I"=>1}, "N"=>{"M"=>1, "O"=>1, "J"=>1}, "O"=>{"N"=>1, "P"=>1, "K"=>1}, "P"=>{"O"=>1, "L"=>1}} 

现在我想从这个哈希中遍历并创建一条路径。例如:

从源 A 到目的地:L

输出应为:A -> E -> I -> J -> K -> LA -> B -> C -> D -> H -> L

这是我写的函数:

def find_path(src, dst, init = [])
  path = [src]
  neighbors = self.neighbors(src)
  puts "src: #{src}"
  puts "dst: #{dst}"
  # puts "node: #{node}"
  puts "init: #{init}"
  puts "path: #{path}"
  puts "----\n"

  if neighbors.include?(dst)
    path.push(dst)
  else
    path.push(@nodes[src].keys.map{|k| k unless init.flatten.include? k }.reject(&:blank?).each{|key| self.find_path(key, dst, init << path) } )
  end
  return path
end

但是,这只会打印:["A", ["B", "E"]]

这不是我们想要的输出,谁能告诉我如何去做这个工作?谢谢。

更新:这用于定位地图最短路径的路线(具有权重/距离的连接节点)。以下是我试图在这个问题中实现的详细信息:https://gist.github.com/suryart/6439102

【问题讨论】:

  • 你能解释一下你的算法吗?
  • 你能解释一下你是如何得到想要的答案的吗?哈希是干什么用的?这些数字是什么意思(如果它们意味着什么,因为所有数字都是 1)?
  • 数字对于我正在寻找的答案没有任何意义。它们是两个节点之间的距离/权重。我想遍历连接这些节点的路径。下面的答案是我正在寻找的确切解决方案。我将在一小时内更新问题,并参考包含所有细节的要点。谢谢你的时间。 :)

标签: ruby-on-rails ruby hash ruby-on-rails-3.2 hashmap


【解决方案1】:

原始哈希:

h = {"A"=>{"B"=>1, "E"=>1}, "B"=>{"A"=>1, "C"=>1, "F"=>1}, "C"=>{"B"=>1, "D"=>1, "G"=>1}, "D"=>{"C"=>1, "H"=>1}, "E"=>{"F"=>1, "A"=>1, "I"=>1}, "F"=>{"E"=>1, "G"=>1, "B"=>1, "J"=>1}, "G"=>{"F"=>1, "H"=>1, "C"=>1, "K"=>1}, "H"=>{"G"=>1, "D"=>1, "L"=>1}, "I"=>{"J"=>1, "E"=>1, "M"=>1}, "J"=>{"I"=>1, "K"=>1, "F"=>1, "N"=>1}, "K"=>{"J"=>1, "L"=>1, "G"=>1, "O"=>1}, "L"=>{"K"=>1, "H"=>1, "P"=>1}, "M"=>{"N"=>1, "I"=>1}, "N"=>{"M"=>1, "O"=>1, "J"=>1}, "O"=>{"N"=>1, "P"=>1, "K"=>1}, "P"=>{"O"=>1, "L"=>1}} 

转换原始哈希,因为它的格式很糟糕:

h.keys.each{|k| h[k] = h[k].keys}
h.default = []

方法:

def find_path h, src, dst
  paths = [[src]]
  loop do
    paths = paths.flat_map do |path|
      h[path.last].map do |nekst|
        a = [*path, nekst]
        a.last == dst ? (return a) : a
      end
    end
  end
end

尝试一下:

find_path(h, "A", "L")
# => ["A", "B", "C", "D", "H", "L"]

请注意,如果没有解决方案,则循环可能会永远运行。您可能希望通过对长度添加限制来限制它。

【讨论】:

  • 我也会尝试更新问题。关于哈希中的数字是什么意思,算法是什么等等。谢谢你的时间。
  • +1 表示“转换原始哈希,因为它的格式很糟糕:”
猜你喜欢
  • 2021-07-07
  • 2011-04-20
  • 2011-09-20
  • 2012-11-19
  • 1970-01-01
  • 2011-10-20
  • 1970-01-01
  • 2017-04-12
  • 1970-01-01
相关资源
最近更新 更多