ruby - ruby 中的字母拓扑排序

标签 ruby sorting topological-sort alphabetical-sort

假设我有这个依赖树:

view dependencies graph

digraph G {
    view1_1 -> view1
    view1_2 -> view1
    a_view1_1_1 -> view1_1
    c_view1_and_1_1 -> view1_1
    c_view1_and_1_1 -> view1
    z_view1_1_2 -> view1_1
}

我怎样才能得到这个作为结果订单:

view1
view1_1
a_view1_1_1
c_view1_and_1_1
view1_2
z_view1_1_2

在某些情况下,它是为了在开源项目上生成可重现的文件输出:https://github.com/thoughtbot/scenic/pull/191

我开始混合使用 tsort 和原始字母排序,例如:

最佳答案

我意识到 tsort 给我的输出实际上是正确的,即使与我的直觉不一样:

require 'tsort'

tree = {
  "view1" => [],
  "view1_1" => ["view1"],
  "view1_2" => ["view1"],
  "a_view1_1_1" => ["view1_1"],
  "c_view1_and_1_1" => ["view1_1", "view1"],
  "z_view1_1_2" => ["view1_1"],
}

class Hash
  include TSort

  def tsort_each_node(&block)
    keys.sort.each(&block)
  end

  def tsort_each_child(node, &block)
    fetch(node).each { |n| yield(n) }
  end
end

tree = Hash[*tree.to_a.shuffle.flatten(1)]

puts tree.tsort

# BONUS: p tree.strongly_connected_components

给出:

view1
view1_1
a_view1_1_1
c_view1_and_1_1
view1_2
z_view1_1_2

关于ruby - ruby 中的字母拓扑排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42917771/

相关文章:

ruby - Firefox 无法打开 - cron、ruby、firewatir

ruby-on-rails - 合并两个都具有键值对的数组 (Ruby)

ruby-on-rails - 如何将数据附加到csv文件

python - 如何按内部列表的特定索引对列表列表进行排序?

algorithm - (合并排序)是 n log n 的 log,以 2 为底?

java - 单根有向无环图环检测

algorithm - 如何检查依赖图中的额外冲突信息?

ruby JSON.pretty_generate(hash,opts) 不使用 opts

hibernate - 如何在hql中对链接列表进行排序?

sql-server-2008 - sql中的拓扑排序