数据结构之拓扑排序

server/2024/10/19 16:35:24/

拓扑排序(Topological Sorting)是针对有向无环图(Directed Acyclic Graph, DAG)的一种排序方式,它将图中的顶点排成一个线性序列,使得图中任意一对顶点u和v,若存在边u->v,则u在序列中出现在v的前面。换句话说,拓扑排序是对有向无环图顶点的一种线性排序,它使得对于从顶点u到顶点v的每一条有向边u->v,顶点u都在顶点v之前。

拓扑排序的算法步骤

1、选择一个入度为0的顶点:在图的所有顶点中,找到入度为0(即没有边指向它)的顶点。这样的顶点可以作为拓扑排序的起始点,因为没有任何顶点指向它,所以它不会被其他顶点所依赖。

2、将该顶点加入结果序列:将找到的入度为0的顶点加入到拓扑排序的结果序列中,并从图中删除该顶点及其发出的所有边。

3、重复上述步骤:继续在图中寻找入度为0的顶点,并将其加入到结果序列中,直到图中所有顶点都被加入结果序列或图中没有入度为0的顶点为止。

4、检查图中是否还有剩余边:如果图中还剩下边,则说明图中存在环,因为至少有一个顶点没有被加入到结果序列中,但已经没有入度为0的顶点可以选择了,这意味着图中存在至少一个环使得这些顶点相互依赖。此时,拓扑排序不可能进行。

拓扑排序的实现

拓扑排序可以通过多种方式实现,如使用入度数组(或称为度表)结合队列或栈。以下是一个使用队列实现的简单示例:

1、计算所有顶点的入度:遍历图中的每一条边,对每条边u->v,将顶点v的入度加1。

2、将所有入度为0的顶点加入队列:遍历所有顶点,将入度为0的顶点加入到队列中。

3、进行拓扑排序:当队列不为空时,从队列中取出一个顶点v,将其加入到结果序列中,并遍历顶点v的所有邻接点u,将u的入度减1。如果u的入度变为0,则将u加入队列。

4、检查结果:如果结果序列中的顶点数等于图中的顶点数,则拓扑排序成功;否则,图中存在环,拓扑排序失败。

拓扑排序的应用

拓扑排序在多个领域都有广泛的应用,如:

1、任务调度:在任务调度中,任务之间可能存在依赖关系,拓扑排序可以帮助我们确定任务的执行顺序。

2、编译器的依赖分析:在编译器中,源文件之间可能存在包含关系,拓扑排序可以帮助我们确定源文件的编译顺序。

3、课程安排:在大学课程安排中,课程之间可能存在先修关系,拓扑排序可以帮助我们确定课程的学习顺序。


http://www.ppmy.cn/server/109632.html

相关文章

【Spring】已解决:Spring Cloud 项目子项目依赖报错问题

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 引言: 在构建Spring Cloud项目时,开发者可能会遭遇子项目之间的依赖报错。这种问题不仅影响开发进度&am…

MobaXterm连接服务器

一、介绍 MobaXterm 是一款功能强大的终端仿真软件,它集成了多种常用的网络工具和命令行工具,包括 SSH、SFTP、RDP、VNC、FTP 等,能够帮助用户轻松管理远程服务器和网络设备。MobaXterm 提供了用户友好的界面和丰富的功能,支持多…

单片机-串口通信(二)

目录 一、串口概念 1.相关概念: 按数据传输方式分类: 按时钟分类 二、STM32F103ZET6中串口 USART特性: NRZ数据格式: 三、配置串口通信 查看硬件原理图 软件配置流程 USART相关的寄存器 新建my_usart1.c和my_usart1.h …

linux安装mysql数据库,含公网链接(有网络带网安装)

1.检查是否存在mysql mysql出现这个,代表没安装 -bash: mysql: command not found 2.检查是否有mariadb数据库,如果有,需要先卸载。 rpm -qa | grep mariadb3.卸载现有的数据库 rpm -e --上个命令显示的名字4.在线安装,需要外…

大规模预训练语言模型的参数高效微调

人工智能咨询培训老师叶梓 转载标明出处 大规模预训练语言模型(PLMs)在特定下游任务上的微调和存储成本极高,这限制了它们在实际应用中的可行性。为了解决这一问题,来自清华大学和北京人工智能研究院的研究团队探索了一种优化模型…

Stable Diffusion绘画 | LightFlow工作流插件:一键导入,高效生图

LightFlow 是腾讯开源的工作流插件,通过它可以非常轻松地导入和导出工作流文件,从而快速地加载整个工作流。 下载后,放置在:SD安装目录\extensions,重载UI 即可使用,插件位置在生成图片区域下方&#xff1…

使用Vue创建cesium项目模版该如何选择?

目录 问题描述模版说明及选用建议小结 问题描述 刚入手这个项目,什么都是一知半解。使用Vue,创建Cesium项目的时候,提示需要选择一个模版(如下图所示),该如何选择项目模版选,总结如下: 模版说明…

深度学习100问34:什么是梯度爆炸

嘿,咱来聊聊梯度爆炸是啥。想象一下又有一群小伙伴站成一排玩传话游戏。不过这次可不是信息变弱啦,而是每传一次话,信息就被疯狂夸大。就好像第一个小伙伴说“今天天气不错”,传到第二个小伙伴那儿就变成了“今天天气超级无敌棒”…