拓扑排序图解-Kahn算法和深度优先搜索

拓扑排序 是将一个有向无环图中的每个节点按照依赖关系进行排序。比如图 G G G存在边 < u , v > <u,v> <u,v> 代表 v v v的依赖 u u u, 那么在拓扑排序中,节点 u u u一定在 v v v的前面。

从另一个角度看,拓扑排序是一种图遍历,具有两个性质:

  • G G G中的每个节点 v v v在排序序列中仅出现一次。
  • 节点 v v v当且仅当其依赖的所有节点 u u u被访问完成,才被访问。

拓扑排序能够在 O ( V + E ) O(V+E) O(V+E)的线性时间内完成,分为两种算法-Kahn算法和深度优先搜索

拓扑排序实例

在这里插入图片描述
这个图有很多有效的拓扑排序,包括:

视觉从左到右,从上到下:

5, 7, 3, 11, 8, 2, 9, 10

最小编号的可用顶点优先:

3, 5, 7, 8, 11, 2, 9, 10

按入边邻居的字典顺序:

3, 5, 7, 8, 11, 2, 10, 9

最少边数优先:

5, 7, 3, 8, 11, 2, 10, 9

最大编号的可用顶点优先:

7, 5, 11, 3, 10, 8, 9, 2

尝试从上到下,从左到右:

5, 7, 11, 2, 3, 8, 9, 10

任意顺序:

3, 7, 8, 5, 11, 10, 2, 9

Kahn算法

L ← Empty list that will contain the sorted elements
S ← Set of all nodes with no incoming edgewhile S is not empty doremove a node n from Sadd n to Lfor each node m with an edge e from n to m doremove edge e from the graphif m has no other incoming edges theninsert m into Sif graph has edges thenreturn error   (graph has at least one cycle)
else return L   (a topologically sorted order)

这个算法的思想是:

  • 首先,在非空的有向无环图中,找到一组没有入边的起始节点,并将它们插入一个集合 S。上节图中的3,5,7 都是起始节点。
  • 从S取出一个节点 n n n,追加到列表L
  • 对于每个依赖节点 n n n的节点 m m m, 删除边 < n , m > <n,m> <n,m>
  • 如果节点 m m m变成起始节点,即入度为0, 那么加入集合S.
  • 最后如果图中还有未删除的边,那说明图存在环路,无法拓扑排序;否则输出拓扑排序序列

算法依据的原理是什么?

无环图的正常遍历情况是这样的:

黄色代表集合S中的节点

在这里插入图片描述

有环图的情况:

如果图G中有环,遍历至环路中任一节点,因为无法在环路中,找到任何一个开始节点进入环路,导致S为空,算法中止。
在这里插入图片描述

深度优先搜索

L ← Empty list that will contain the sorted nodes
while exists nodes without a permanent mark doselect an unmarked node nvisit(n)function visit(node n)if n has a permanent mark thenreturnif n has a temporary mark thenstop   (graph has at least one cycle)mark n with a temporary markfor each node m with an edge from n to m dovisit(m)remove temporary mark from nmark n with a permanent markadd n to head of L

Kahn算法会破坏原来图的数据,而深度优先不会。深度优先算法采取的是标记方式探测环路。

注意到节点 n n n, 是添加到列表头部,因为是深度优先搜索,节点 n n n带永久标记代表从 n n n出发的能访问到的节点都被访问了,
即所有依赖节点 n n n的节点都已在列表里了。

无环路情况

  • 绿色为永久标记,代表从此节点出发的能访问到的节点都被访问了
  • 橙色为临时标记

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

环路情况:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/305571.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【计算机毕业设计】SSM医疗药品采购系统

项目介绍 ssm医疗药品采购系统。主要功能有&#xff1a; 用户管理&#xff1a;管理员列表&#xff1b; 采购管理&#xff1a;采购列表&#xff1b; 药品出库&#xff1a;药品出库&#xff1b; 库存管理&#xff1a;库存统计&#xff1b; 数据维护&#xff1a;药品列表、仓库…

Java多线程常见的成员方法(线程优先级,守护线程,礼让/插入线程)

目录 1.多线程常见的成员方法2.优先级相关的方法3.守护线程&#xff08;备胎线程&#xff09;4.其他线程 1.多线程常见的成员方法 ①如果没有给线程设置名字&#xff0c;线程是有默认名字 的&#xff1a;Thread-X(X序号&#xff0c;从0开始) ②如果要给线程设置名字&#xff0c…

骑砍战团MOD开发(25)-module_animations.py骨骼动画

一.引擎固化骨架 Data\skeleton_bodies.xml:定义系统骨架skel_human,skel_horse. <Skeletons><Skeleton name"skel_human"><Skeleton name"skel_horse"> </Skeletons> CommonRes\skeletons.brf 为skel_human的资源文件,适用BRF打…

第三节 项目commit规范

系列文章目录 目录 系列文章目录 前言 实现方法 总结 前言 多人开发项目时&#xff0c;每次Git提交都不明确提交了什么&#xff0c;增加功能&#xff1f;修复bug&#xff1f;修改了代码格式&#xff1f;没有哦规则。那我们制定制定提交类型及如何写提交信息的规则&#xf…

接口测试工具——ApiFox使用初体验 postman导出和ApiFox导入

目录 ApiFox使用初体验初步使用从postman导出到apifox导入 IDEA简单测试Postman测试工具post请求 接口测试工具swaggerKnife4j1.引入依赖2.配置3.常用注解4.接口测试 JMeter什么是JMeter?JMeter安装配置1.官网下载2.下载后解压3.汉语设置 JMeter的使用方法1.新建线程组2.设置参…

Go 泛型之泛型约束

Go 泛型之泛型约束 文章目录 Go 泛型之泛型约束一、引入二、最宽松的约束&#xff1a;any三、支持比较操作的内置约束&#xff1a;comparable四、自定义约束五、类型集合&#xff08;type set&#xff09;六、简化版的约束形式七、约束的类型推断八、小结 一、引入 虽然泛型是…

Tiny Object Detection

文章目录 RFLA: Gaussian Receptive Field based Label Assignment for Tiny Object Detection&#xff08;ECCV2022&#xff09;Dynamic Coarse-to-Fine Learning for Oriented Tiny Object Detection&#xff08;CVPR2023&#xff09;TOD-CMLNN&#xff08;2023&#xff09; …

Bind for 0.0.0.0:2379 failed: port is already allocated

1、执行命令docker-compose -p docker-apisix up -d 报错 Error response from daemon: driver failed programming external connectivity on endpoint docker-apisix-etcd-1 (2a92a0cefff9194fcd1dad4bdeabf4201d9047ec2633eda455c6e46528668af4): Bind for 0.0.0.0:2379 fa…

Vue3-27-路由-路径参数的简单使用

什么是路径参数 在路由配置中&#xff0c;可以将【参数】放在【路由路径】中&#xff0c; 从而实现&#xff0c;同一个 路由&#xff0c;同一个组件&#xff0c;因路径参数不同&#xff0c;可以渲染出不同的内容。特点 &#xff1a; 1、当携带不同路径参数的路由相互跳转时&am…

im6ull学习总结(三)文字显示

文字显示 字符编码方式 编码与字体 一个字符以不同编码形式会保存为不同的二进制数。 ASCII American Standard Code for Information Interchange”的缩写&#xff0c;美国信息交换标准代码。 一个字节的 7 位就可以表示 128 个数值&#xff0c;在 ASCII 码中最高位永远是…

MySQL事务、四大原则、执行步骤、四种隔离级别、锁、脏读、脏写等

MySQL事务 MySQL事务1.什么是事务&#xff1f;2.事务的四大原则3.事务执行的步骤4、事务的隔离性5、MySQL中的锁 MySQL事务 模拟一个转账业务&#xff1a; 上图中的sql语句&#xff1a; update from table set money mongey - 100 where name A; update from table set mone…

rime中州韵 symbols.custom.yaml 配置

今天我们所做的配置&#xff0c;将实现扩展符号的输入效果&#xff0c;如下&#x1f447;&#xff1a; 基础扩展符号的配置 要实现输入法能够输入扩展的符号&#xff0c;我们需要在输入方案中引入扩展符号集。 如果你使用的输入方案是 wubi_pinyin.schema.yaml&#xff0c;…