拓扑排序是啥意思?
拓扑排序是指: 将有向无环图(DAG)展开为一维的执行序列。DAG顾名思义就是有方向的图,下面这张图就简单说明了啥是有向无环图。一般人可能用到这个算法的情况不多,但是刷leetcode的
课程表
问题肯定遇到过,其次搞人工智能的同学静态图执行顺序也不应该陌生。
先简单分析,从上面的图可以知道,要执行3节点,依赖0,1, 所以需要先执行完0,1。依次类推可以有一下的执行顺序:
此外还有很多排序方式,可见拓扑图的排序有很多选择,只要满足执行依赖要求都是可行的拓扑排序。接下来正式分析一下算法流程:
//入度数组
vector TopologyDfsSort(graph)
{vector in_degree(n,0);init(in_degree, graph);//邻接表unordered_map> map;init(map, graph);//当下可执行的节点集合vector res;// 每次跟新的队列queue q;for(int i=0; iif(in_degree[i]==0) {q.push(i);//入度为0的都可以执行res.push(i);//入度为0的都可以执行}}//更新while(!q.empty()){//一轮执行size个节点,q中是表示该轮可以执行的节点int size = q.size();for(int i=0; iint exec_node = q.front();q.pop();//一旦exec_node执行,那么依赖exec_node的node的入度值都可以减一vector nodes = map[exec_node];for(auto id:nodes){in_degree[id]--;if(in_degree[id]==0)//如果入度为0,那么就可以进入下一轮执行{q.push(id);//入度为0的都可以执行res.push(id);//入度为0的都可以执行}}}}return res;
}
可以参考paddlepaddle源码中的实现:
paddle/fluid/framework/ir/graph_helper.cc:266L