簡體   English   中英

如何從散列中創建路徑?

[英]How do I make a path out of a hash?

我試圖找到地圖最短路徑的路線(連接節點的重量/距離)。

我們假設我有這樣的哈希:

{"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

原始哈希:

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"]

請注意,如果沒有解決方案,那么循環可能會永遠運行。 您可能希望通過添加長度限制來限制它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM