我有一个有向无环图,如下图所示。
我想要实现的是获得**拓扑排序,其中每个节点都具有稍后用于调度的优先级p
(其中更高的值意味着更高的优先级)
通过访问每个节点和边一次(O(| V | + | E |)(https://en.wikipedia.org/wiki/Topological_sorting#Depth-first_search)
,可以在线性时间内计算如下图所示的线性列表的拓扑排序但是,当分配优先级的任务发挥作用时,到目前为止我找不到比下面更好的算法。
n
中的每个节点g
分配优先级p=0
。 n
中的每个节点g
:
n
开始深度优先递归
n
遍历子图时
(有一些小的优化:忽略我们已经开始DFS的子图,只增加子图的优先级偏移量,然后每个节点的优先级由其本地优先级+子图的优先级偏移量计算)
从n
开始的每个深度优先递归都不能通过忽略上面for循环中已经访问过的节点而变得更简单,就像它可以用于简单的拓扑排序一样(图像中的线性列表,({{3 }}))
首先计算拓扑排序(O(| V | + | E |)然后迭代线性列表并分配优先级(O(| V | + | E |)? 我希望有一个不太明确的优先级,以允许并行调度(节点D和E可以在图像中同时安排)
https://en.wikipedia.org/wiki/Topological_sorting#Depth-first_search