加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

clojure – 根据依赖关系排序结果

发布时间:2020-12-14 04:57:32 所属栏目:百科 来源:网络整理
导读:我正在考虑解决编译目标.假设我有一组编译目标,每个目标都有一组自己的依赖项. A - B CB - C E C - E FD - NONEE - FF - NONE 除非其依赖项在先前的传递中,否则无法将目标添加到传递中.即:我想要一个看起来像这样的编译步骤列表: [[D F] [E] [C] [B] [A]]
我正在考虑解决编译目标.假设我有一组编译目标,每个目标都有一组自己的依赖项.

A -> B C

B -> C E 

C -> E F

D -> NONE

E -> F

F -> NONE

除非其依赖项在先前的传递中,否则无法将目标添加到传递中.即:我想要一个看起来像这样的编译步骤列表:

[[D F] [E] [C] [B] [A]]

所以,D和F被编译,然后是E,然后是C,等等……如何做到这一点?

解决方法

地图将是表示直接依赖关系的自然方式

(def direct-dependencies 
  {:a #{:b :c},:b #{:c :e},:c #{:e :f},:d nil,:e #{:f},:f nil})

然后是一个简单的(没有循环检查)拓扑排序

(defn tsort [m] 
  (let [depth (fn depth [x] 
                (if (empty? (m x)) 
                  0 
                  (->> x m (map depth) (apply max) inc)))]
    (map val (sort-by key (group-by depth (keys m))))))

根据需要输出

(tsort direct-dependencies)
;=> ([:f :d] [:e] [:c] [:b] [:a])

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读