大四复习:深入浅出解释拓扑排序

news2024/10/6 4:07:53

我在大二学习拓扑排序的时候,不是很明白,现在已经大四,抽时间复习一下拓扑排序。

什么是拓扑排序?

如何实现拓扑排序?

拓扑排序的拓展


什么是拓扑排序?

 首先拓扑排序的定义如下:

    拓扑排序是一种对有向无环图的顶点进行排序的方法。它的主要目的是产生一个顶点的线性序列,使得如果在图中存在一条从顶点 A 指向顶点 B 的边,则在排序结果中,顶点 A 出现在顶点 B 之前。

什么意思呢?我的理解拓扑排序 简单的说,就是 遍历一个没有环的有向图中, 按照箭头的顺序遍历节点。  

在上面一个有向无环图中,必须先访问a,才可以访问b或c;必须先访问b和c,才可以访问d。

所以,图的拓扑排序为a,b,c,d   或者a,c,b,d

如何实现拓扑排序?

这里我首先给出拓扑排序的算法,只有两步:

第一步:访问一个入度为0的节点

第二步:删除入度为0的节点以及从这个节点出去的所有边,继续执行1,直至图中没有节点。

以上面的图为例,a的入度为0,所以访问a,同时删除a和a的两个出边;此时,b和c节点的入度变为0。

因为b和c的入度都为0,我们可以随便选择一个访问,假设访问的b,删除b节点和它 的出边。

然后访问c节点,删除c节点和它 的出边,此时d节点入度为0,直接删除d节点,图中没有节点;

算法执行完毕。所以一个拓扑排序是  a,b,c,d。

如何来实现呢?我这里直接给出结论:使用BFS进行拓扑排序。

  1. 计算入度:对于图中的每个顶点,计算它的入度(即有多少边指向该顶点)。

  2. 初始化队列:创建一个队列,用于存储所有入度为 0 的顶点。这些顶点没有任何先决条件,可以立即处理。

  3. 拓扑排序

    • 当队列不为空时,从队列中移除一个顶点,并将其添加到拓扑排序的结果中。
    • 遍历该顶点的所有邻接顶点,将这些邻接顶点的入度减 1(因为它们的一个依赖已经被移除了)。
    • 如果任何邻接顶点的入度变为 0,则将其添加到队列中。
  4. 检查是否存在拓扑排序:如果排序结果中的顶点数量不等于图中的顶点总数,则说明图中存在环,因此不存在拓扑排序。

为什么可以使用BFS呢?(BFS算法不在这里多讲了。)

   BFS 以层级的方式遍历,在处理当前层的顶点之前,所有的前置顶点(即入度已被减至 0 的顶点)已经被处理。这种层级性保证了拓扑排序的正确性。

伪代码:

下面举一个具体的题目,leetcode207. 课程表

class Solution {
public:
    bool canFinish(int n, vector<vector<int>>& p) {
        vector<int>d(n,0);
        vector<vector<int>>g(n);
        for(int i=0;i<p.size();i++){
            g[p[i][0]].push_back(p[i][1]);
            d[p[i][1]]++;
        }
        queue<int>q;
        int cnt=0;
        for(int i=0;i<n;i++)if(d[i]==0)q.push(i);
        while(!q.empty()){
            int t=q.front();
            q.pop();
            cnt++;
            for(auto ne:g[t]){
                d[ne]--;
                if(d[ne]==0)q.push(ne);
            }
        }
        return cnt==n;
    }
};

上面代码使用C++来实现伪代码的功能,具体过程就不写了,和C++的语法有关系。

拓扑排序的拓展

拓扑排序的一个典型应用是解决具有依赖关系的任务调度问题。例如,在编译器中对程序模块进行编译时,必须先编译依赖模块,这种依赖关系就可以通过拓扑排序来解决。

  For example, suppose foo.c calls functions in libx.a and libz.a that call functions in liby.a. Then libx.a and libz.a must precede liby.a on the command line:

  unix> gcc foo.c libx.a libz.a liby.a

 Libraries can be repeated on the command line if necessary to satisfy the dependence requirements. For example, suppose foo.c calls a function in libx.a  that calls a function in liby.a that calls a function in libx.a. Then libx.a must be repeated on the command line:

  unix> gcc foo.c libx.a liby.a libx.a

摘自CSAPP

在编译过程中,模块间的依赖关系可以被视为一个有向图,其中每个模块代表一个顶点,依赖关系表示为有向边。例如,如果模块 A 依赖于模块 B,则会有一条从 B 指向 A 的边。

对于CSAPP的例子中,可以使用图来表示这个依赖关系:

拓扑排序还有一个重要的用途是检测循环依赖。如果模块间的依赖关系形成了一个环,那么将无法进行有效的拓扑排序。这在编译过程中是一个关键的检查点,因为循环依赖通常是编程错误。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C语言】SCU安全项目1-FindKeys

目录 前言 命令行参数 16进制转字符串 extract_message1 process_keys12 extract_message2 main process_keys34 前言 因为这个学期基本都在搞CTF的web方向&#xff0c;C语言不免荒废。所幸还会一点指针相关的知识&#xff0c;故第一个安全项目做的挺顺利的&#xff0c…

龙芯loongarch64服务器编译安装gcc-8.3.0

前言 当前电脑的gcc版本为8.3.0,但是在编译其他依赖包的时候,出现各种奇怪的问题,会莫名其妙的中断编译。本地文章讲解如何自编译安装gcc,替换系统自带的gcc。 环境准备 下载页面:龙芯开源社区网站 - LoongArch GCC 8.3 交叉工具链 - 源码下载源码包名称如:loongson-gnu…

修改antd表单Form.Item的label颜色的方法

默认的Form.item的标签颜色为黑色&#xff0c;但是如果我是用深色背景&#xff0c;这样的情况下表单就看不清楚label了&#xff0c;就像下面的情况&#xff0c;密码两个字完全看不到&#xff0c;所以想把它改为白色字体&#xff0c;就像上面的账号两个字一样&#xff1a; 所以怎…

黑马点评05分布式锁 1互斥锁和过期时间

实战篇-09.分布式锁-基本原理和不同实现方式对比_哔哩哔哩_bilibili 1.分布式锁 因为jvm内部的sychonized锁无法在不同jvm之间共享锁监视器&#xff0c;所以需要一个jvm外部的锁来共享。 2.redis setnx互斥锁 加锁解锁即可 2.1不释放锁可能死锁 redis 的setnx不会自动释放锁…

C语言是否已经跟不上社会需求?

今日话题。C语言是否已经跟不上社会需求&#xff1f;一个问题的提出者说&#xff0c;几天前他受到老板的批评&#xff0c;因为他只精通C语言编程&#xff0c;无法满足老板的需求。实际上&#xff0c;C语言在嵌入式行业中仍然具有极高的价值。它高效、可移植&#xff0c;并广泛用…

选择正确的自动化测试工具:打造高效测试流程的必备利器!

摘要 自动化测试正在逐步取代部分手动测试&#xff0c;因为它可以节省时间并提高测试质量。特别是在进行回归测试的情况下&#xff0c;自动化可以通过多种方式提高效率。手动进行重复测试是浪费时间和资源。此外&#xff0c;由于重复测试可能会遗漏&#xff0c;因此存在一定的…

Android Stuido报错处理

仅用作报错记录。防止以后出项问题不知如何解决。 报错1 Dependency‘androidx.annotation:xx requires libraries and applications … 需要修改CompileSDKVersion更改为报错中提示的版本 打开项目build.gradle文件&#xff0c;将compileSdk和targetSdk修改为报错中提示的版…

从数藏到链游,最近爆火的链游理想城,一天直接干爆服务器!

大家好&#xff0c;我是吴军&#xff0c;一家软件开发公司的营销经理 今天我们来聊聊链游以及数字藏品&#xff0c;2022年4月开始&#xff0c;一众数藏平台犹如雨后春笋冒出来&#xff0c;由ibox牵头&#xff0c;开始了一场掘金盛宴&#xff0c;许多大学生都相继入场&#xff…

【1.7计算机组成与体系结构】主存编址计算

目录 1.主存编址2.主存编址计算公式3.例题&#xff1a; 1.主存编址 1bit(比特位) 1B(字节)8bit(比特位) 1KB1024B 1MB1024KB 1GB1024MB 2.主存编址计算公式 &#x1f534;存储单元 存储单元个数最大地址-最小地址1 &#x1f534;编址内容 按字编址:存储体的存储单元是字存储…

专科毕业,应届生零基础如何七天搞定自动化测试?

现在很多测试人员有些急于求成&#xff0c;没有任何基础想当然的&#xff0c;要在一周内上手自动化测试。 在自动化的过程中时候总有人会犯很低级的问题&#xff0c;有语法问题&#xff0c;有定位问题&#xff0c;而且有人居然连__init__.py 文件名都弄错误&#xff0c;还有将…

90%的人学Python爬虫都干过这种事,别不承认!

可以说&#xff0c;我是因为想批量下载一个网站的图片&#xff0c;才开始学的python爬虫。当一张一张图片自动下载下来时&#xff0c;满满的成就感&#xff0c;也满满的罪恶感……哈哈哈&#xff01;&#xff01;&#xff01;窈窕淑女&#xff0c;君子好逑&#xff0c;这篇文章…

防止反编译,保护你的SpringBoot项目

ClassFinal-maven-plugin插件是一个用于加密Java字节码的工具&#xff0c;它能够保护你的Spring Boot项目中的源代码和配置文件不被非法获取或篡改。下面是如何使用这个插件来加密test.jar包的详细步骤&#xff1a; 安装并设置Maven&#xff1a; 首先确保你已经在你的开发环境中…

C/C++函数递归的趣味题

1、汉诺塔问题 题目&#xff1a; 先来分析一下当圆盘数较小时的操作步骤。 代码 //递归求解汉诺塔问题 void move(char, char); void HanoiTower(int, char, char, char); int main() {cout << "请输入A柱上的圆盘数量&#xff1a;";int n;cin >> n;Han…

Java研学-JavaScript 进阶

一 JS 的 DOM 1 概述 DOM 是 Document Object Model 文档对象模型的缩写。根据 W3C 的 DOM 规范&#xff0c;它是一种与浏览器&#xff0c;平台&#xff0c;语言无关的接口&#xff0c;能够动态地修改 XML 和 HTML。   D&#xff1a;文档 – HTML文档 或 XML 文档   O&…

物联网在能源管理中的应用——青创智通工业物联网解决方案

随着全球能源资源的日益紧张和环境问题的日益突出&#xff0c;能源管理已成为当今社会的重要议题。物联网技术的快速发展为能源管理提供了新的解决方案。本文将介绍物联网在能源管理中的应用及其优势。 一、物联网在能源管理中的应用 1. 智能电网 智能电网是物联网在能源管理中…

【基于BP神经网络的房价预测系统设计与实现】

基于BP神经网络的房价预测系统设计与实现 摘要1. 引言2. 数据获取与预处理3. 数据分析与可视化4. 系统功能设计4.1 用户登录注册4.2 房价数据展示4.3 房价变化趋势4.4 各区房价对比4.5 房间数和朝向分析4.6 房价预测 5. 创新点与意义6. 结论与展望结尾 摘要 本文介绍了一项基于…

Video anomaly detection with spatio-temporal dissociation 论文阅读

Video anomaly detection with spatio-temporal dissociation 摘要1.介绍2.相关工作3. Methods3.1. Overview3.2. Spatial autoencoder3.3. Motion autoencoder3.4. Variance attention module3.5. Clustering3.6. The training objective function 4. Experiments5. Conclusio…

骨传导耳机跟开放式耳机有什么关系?骨传导耳机和气传导耳机谁更值得入手?

开放式耳机是指开放双耳佩戴的耳机&#xff0c;骨传导耳机也算开放式耳机的一种&#xff0c;除了骨传导耳机外&#xff0c;还有气传导耳机&#xff0c;这两种耳机都算开放式耳机&#xff0c;不过传声方式有所不同。 骨传导耳机&#xff1a;通过颅骨震动来进行传导声音&#xff…

更长的 GPT-4 对话 token 上限,如何影响我的翻译工作流?

&#xff08;注&#xff1a;本文为小报童精选文章&#xff0c;已订阅小报童或加入知识星球「玉树芝兰」用户请勿重复付费&#xff09; 顺便聊聊生成式 AI 对你将来的工作流究竟有什么影响。 惊喜 Setapp 里面的 Typingmind 终于可以支持 128K token 窗口的 GPT-4 Turbo 了。只要…

5G工业物联网网关,比4G工业网关强在哪里?

​随着5G技术的广泛应用&#xff0c;越来越多的行业开始探索如何利用5G网络提升效率和创新能力。其中&#xff0c;工业物联网领域是受益最大的领域之一。作为连接物联网设备和网络的关键组件&#xff0c;5G工业物联网网关在这个变革中发挥着至关重要的作用。本文将深入探讨5G工…