网站素材类型,高性能网站建设 pdf,四川建设局网站,高端网吧文章目录 0. 概述1. 零入度算法1. 1 拓扑排序1. 2 算法 2. 零出度算法2.1 算法2.2 实现2.3. 复杂度 0. 概述
学习下拓扑排序
1. 零入度算法
1. 1 拓扑排序 首先理解下拓扑排序 其实老师经常干这事#xff0c;如编讲义#xff0c;将已经知道的知识点串起来变成讲课序列。那… 文章目录 0. 概述1. 零入度算法1. 1 拓扑排序1. 2 算法 2. 零出度算法2.1 算法2.2 实现2.3. 复杂度 0. 概述
学习下拓扑排序
1. 零入度算法
1. 1 拓扑排序 首先理解下拓扑排序 其实老师经常干这事如编讲义将已经知道的知识点串起来变成讲课序列。那怎么串起来呢将知识点列出将它们之间的相互关系描述下。要讲priority queue那上一讲需要讲什么内容要讲hashing需要讲哪些内容需要罗列出来。但是讲课不可能像分支一样平行一分为二裂开最终都会变成下面这样平坦的线性序列。 续一个好的安排是什么呢每当讲到一个知识点时它所依赖的知识点都应该在此前依然讲过这样就会变成一个线性序列。将原来图中所有的点整理成这样一个线性次序前面点与后面点的边次序都是前指向后没有后指向前这就是对原图的拓扑排序。 1. 2 算法
如果真有这么一个图怎么排呢 因为这个图有依赖关系所以是不折不扣的有向图但有意思的是这里不能有环如果有环路就有问题。 首先需要找到零入度的点——无任何依赖在dag图中必然有这么一个点由于DAG子图亦为DAG于是可以利用减而治之思想将这个零入度的点抹掉接着找下一个零入度点。
那么这个算法如何实现 图中已经有零入度的点A或B任取一个这里取A放入队列中等价将A点及其边从图中删除。由于DAG的子图亦是DAG所以还会有零入度的点将B点放入队列中然后依次类推当所有的点都放入队列后队列中的节点顺序就是拓扑排序。
但这个方法并不好实现起来比较麻烦需要每次去找那个零入度的点而且删除点及其边的时候还要更新相应信息可能会对图产生伤害那怎么做呢看下下面的零出度算法
2. 零出度算法
2.1 算法
说服下自己DAG既有零入度点也有零出度点这个很重要为什么这么讲因为之前的DFS深度优先搜索可以帮我们实现这个方法。 这样要做的事就比较简单不需要零入度算法那这样改改度数等等。之前已经造出DFS算法这样就可以搭DFS便车实现零出度算法。
如何实现呢
2.2 实现 这里引入一个栈排序结果将以逆序打印出来。随便找一个点这里首先访问顶点V将顶点V状态初始值设置为DISCOVERED接着枚举V的所有邻居视u的状态分别处理后续会做分析。访问所有邻居后将顶点V的状态设置为VISITED然后顶点V入栈。
接着还有顶点V的邻居处理方法还未做交代怎么处理呢
若顶点U的状态为UNDISCOVERED更新顶点U的父亲为V边的状态为TREE作递归调用从顶点u处深入。顶点U的状态为DISCOVERED一旦发现后向边即图非DAG图无拓扑排序则退出而不再深入。顶点U的状态为VISITED更新下顶点状态。
2.3. 复杂度
这里仅额外引入的栈规模不超过顶点总数O(n)。总体而言空间复杂度与基本的深度优先搜索算法同样仍为O(n e)。该算法的递归跟踪过程与标准DFS搜索完全一致且各递归实例自身的执行时间依然保持为O(1)故总体运行时间仍为O(n e)。