DSA 经典数据结构与算法 学习心得和知识总结(三) |有向无环图及其应用


注:提前言明 本文借鉴了以下博主、书籍或网站的内容,其列表如下:

1、参考书籍:《算法导论》第三版      就是这本被封神的杰作,就是它🤦
2、参考书籍:《数据结构》严奶奶版
3、参考书籍:《数据结构》(用面向对象方法与C++语言描述) 第二版 殷人昆版
4、参考书籍:《数据结构》(C++版) 第三版 邓俊辉版
5、华中科技大学 有向无环图及应用 公开课,点击前往
6、OI Wiki 有向无环图,点击前往
7、OI Wiki 拓扑排序,点击前往
8、关键路径 + 拓扑排序,点击前往


DSA 经典数据结构与算法 有向无环图

  • 文章快速说明索引
  • 有向无环图的背景
    • 拓扑排序
    • 逆拓扑排序
    • AOV 网
    • 关键路径和 AOE 网


在这里插入图片描述


文章快速说明索引

学习目标:

前言:还记得在大学的时候,数据结构作为计算机科学与技术专业最重要的一门课 当时学校采用的教材是严奶奶的粉红色那本,不过当时是真的不愿多看一眼 😂 苦涩难懂 又非常深奥,满篇伪代码实现的例子和夏日那十分惬意的下午 简直让人头大而晕!

也可能是上学那会儿年少浮躁,也可能是因为当时的能力比较的菜吧 ┑( ̄Д  ̄)┍ 。现在再回头捧读厚厚的《算法导论》,竟然有一种说不上来的快乐 沉浸在数据结构和算法之美,惊叹于高超技巧式拍案惊奇!


学习内容:(详见目录)

1、数据结构与算法(DSA)之有向无环图


学习时间:

2024年02月15日 14:17:05


学习产出:

1、CSDN 技术博客 1篇


有向无环图的背景

有向无环图(Directed Acyclic Graph):一个无环的有向图。

  1. 其性质如下:
  • 拓扑排序 的图,一定是有向无环图;如果有环,那么环上的任意两个节点在任意序列中都不满足条件了
  • 有向无环图,一定能拓扑排序;(归纳法)假设节点数不超过 k 的 有向无环图都能拓扑排序,那么对于节点数等于 k 的,考虑执行拓扑排序第一步之后的情形即可

  1. 如何判定一个图是否是有向无环图呢?
  • 检验它是否可以进行 拓扑排序 即可
  • 当然也有另外的方法,可以对图进行一遍 DFS,在得到的 DFS 树上看看有没有连向祖先的非树边(返祖边)。如果有的话,那就有环了

接下来看一下 DAG 的应用, 如下:

一、描述表达式:

// 如下表达式含 + * 操作

((a + b) * (b * (c + d)) + (c + d) * e) * ((c + d) * e)

用二叉树表示这个表达式,(21个顶点)如下:

在这里插入图片描述

用有向无环图表示该表达式,(12个顶点)如下:

在这里插入图片描述


二、表示 AOV网 (Activity On Vertex Network) or AOE网(Activity On Edge)

在这里插入图片描述

  • 什么是AOV网与AOE网?——以及AOV网与AOE网区别和运用,点击前往

下面我们再详细介绍它们!


拓扑排序

拓扑排序的英文名是 Topological sorting。拓扑排序要解决的问题是给一个有向无环图的所有节点排序。换言之:其是一个有向无环图(DAG,Directed Acyclic Graph)的所有顶点的线性序列,且该序列必须满足下面两个条件:

  • 每个顶点出现且只出现一次
  • 若存在一条从顶点 A 到顶点 B 的路径,那么在序列中顶点 A 出现在顶点 B 的前面
  • 有向无环图(DAG)才有拓扑排序,非DAG就没有拓扑排序一说

一个经典的案例,如下:

在这里插入图片描述

因此我们可以说:

  • 在一个 DAG(有向无环图) 中,我们将图中的顶点以线性方式进行排序,使得对于任何的顶点 u 到 v 的有向边 (u,v),都可以有 u 在 v 的前面
  • 还有给定一个 DAG,如果从 i 到 j 有边,则认为 j 依赖于 i。如果 i 到 j 有路径(i 可达 j),则称 j 间接依赖于 i
  • 拓扑排序的目标是将所有节点排序,使得排在前面的节点不能依赖于排在后面的节点

举一个例子,如下:

  • 拓扑排序(Topological Sorting),点击前往

在这里插入图片描述


逆拓扑排序

逆拓扑排序的步骤:

  • 从AOV网中选择一个出度为0的顶点并输出
  • 从网中删除该顶点和所有以它为终点的有向边
  • 重复1和2,直到当前的AOV网为空

AOV 网

日常生活中,一项大的工程可以看作是由若干个子工程组成的集合,这些子工程之间必定存在一定的先后顺序,即某些子工程必须在其他的一些子工程完成后才能开始。

我们用有向图来表现子工程之间的先后关系,子工程之间的先后关系为有向边,这种有向图称为顶点活动网络,即 AOV 网 (Activity On Vertex Network)。一个 AOV 网必定是一个有向无环图,即不带有回路。与 DAG 不同的是,AOV 的活动都表示在边上。

在 AOV 网中,顶点表示活动,弧表示活动间的优先关系。AOV 网中不应该出现环,这样就能够找到一个顶点序列,使得每个顶点代表的活动的前驱活动都排在该顶点的前面,这样的序列称为拓扑序列(一个 AOV 网的拓扑序列不是唯一的),由 AOV 网构造拓扑序列的过程称为拓扑排序。因此,拓扑排序也可以解释为将 AOV 网中所有活动排成一个序列,使得每个活动的前驱活动都排在该活动的前面(一个 AOV 网中的拓扑排序也不是唯一的)。

  • 前驱活动:有向边起点的活动称为终点的前驱活动(只有当一个活动的前驱全部都完成后,这个活动才能进行)
  • 后继活动:有向边终点的活动称为起点的后继活动

检测 AOV 网中是否带环的方式是构造拓扑序列,看是否包含所有顶点。构造这个拓扑序列步骤:

  1. 从图中选择一个入度为零的点
  2. 输出该顶点,从图中删除此顶点及其所有的出边
  3. 重复上面两步,直到所有顶点都输出,拓扑排序完成,或者图中不存在入度为零的点,此时说明图是有环图,拓扑排序无法完成,陷入死锁

关键路径和 AOE 网

与 AOV 网对应的是 AOE 网(Activity On Edge Network) 即边表示活动的网。AOE 网是一个带权的有向无环图,其中,顶点表示事件,弧表示活动持续的时间。通常,AOE 网可以用来估算工程的完成时间。AOE 网应该是无环的,且存在唯一入度为零的起始顶点(源点),以及唯一出度为零的完成顶点(汇点)。

在这里插入图片描述

AOE 网中的有些活动是可以并行进行的,所以完成整个工程的最短时间是从开始点到完成点的最长活动路径长度(这里所说的路径长度是指路径上各活动的持续时间之和,即弧的权值之和,不是路径上弧的数目)。因为一项工程需要完成所有工程内的活动,所以最长的活动路径也是关键路径,它决定工程完成的总时间。


AOE 网的相关基本概念,如下:

  • 活动:AOE 网中,弧表示活动。弧的权值表示活动持续的时间,活动在事件被触发后开始。
  • 事件:AOE 网中,顶点表示事件,事件能被触发。

  • 弧(活动)aj 的最早开始时间:初始点到该弧起点的最长路径长度,记为 e(j)。
  • 弧(活动)aj 的最迟开始时间:在不推迟整个工期的前提下,工程达到弧起点所表示的状态最晚能容忍的时间,记为 l(j)。即:事件的最迟发生时间 - 弧的活动时间值。

  • 顶点(事件)vj 的最早发生时间:初始点到该顶点的最长路径长度,记为 ve(j),它决定了以该顶点开始的活动的最早发生时间,所以 ve(j) = e(j)。
  • 顶点(事件)vj 的最迟发生时间:在不推迟整个工期的前提下,工程达到顶点所表示的状态最晚能容忍的时间,记为 vl(j),它决定了所有以该状态结束的活动的最迟发生时间,所以 l(j) = vl(j) - dul(aj)。

  • 关键路径:AOE 网中从源点到汇点的最长路径的长度。
  • 关键活动:关键路径上的活动,最早开始时间和最迟开始时间相等(看下面时间余量d(j) = 0的)。

最早和最迟发生时间的递推关系:

在这里插入图片描述

按拓扑顺序求,最早是从前往后,前驱顶点的最早开始时间与边的权重之和最大者;最迟是从后往前,后继顶点的最迟开始时间与边的权重之差的最小者。


下面看一个例子,计算如下:

在这里插入图片描述

如上图,其其中之一的拓扑排序,如下:

V1 V3 V2 V5 V4 V6
V1V2V3V4V5V6
ve(j):事件 的最早发生时间 ->0326 max68 max
vl(j):事件 的最迟发生时间 <-04 min2 min678
a1a2a3a4a5a6a7a8
e(j):活动 aj 的最早开始时间 ->00332266
l(j):活动 aj 的最迟开始时间 <-4 - 32 - 26 - 27 - 36 - 48 - 38 - 28 - 1
l(j):活动 aj 的最迟开始时间 <-10442567
d(j):活动 aj 的时间余量 l(j) - e(j)10110301

于是关键活动有:a2 a5 a7。如下:

在这里插入图片描述

V1->V3->V4->V6 就是关键路径,total = 8!


关键路径算法:

  1. 输入 e 条弧 (j,k),建立 AOE 网;
  2. 从源点 v0 出发,令 ve[0] = 0, 按照拓扑排序求其余各个顶点的最早发生时间 ve[i], (i <= i <= n-1)。如果得到的拓扑有序序列中顶点的个数小于网中的顶点数 n,则说明网中存在环,不能求关键路径,算法终止;否则执行步骤 3;
  3. 从汇点 vn 出发,令 vl[n-1] = ve[n-1],按照逆拓扑有序求其余各顶点的最迟发生时间 vl[i], (n-2 >= i >= 2);
  4. 根据各顶点的 ve 和 vl 值,求每条弧 s 的最早开始时间 e(s) 和最迟开始时间 l(s)。若某条弧满足条件 e(s) = l(s), 则为关键活动。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringCloud-搭建Nacos配置中心

一、Nacos 功能介绍 Nacos&#xff08;Dynamic Naming and Configuration Service&#xff09;是阿里巴巴开源的一个分布式服务注册、配置管理&#xff0c;以及服务健康管理平台。在微服务架构中&#xff0c;配置管理是至关重要的一环&#xff0c;Nacos 提供了可靠、动态的配置…

月薪30K-100K,新一波工作机会来了,你准备好了吗

纯血版鸿蒙发布&#xff0c;开启一个新时代 1月18日下午&#xff0c;在“鸿蒙千帆起”发布会上&#xff0c;华为揭秘鸿蒙生态和纯血鸿蒙星河版HarmonyOS NEXT进阶的新进展。“几年来&#xff0c;在众多伙伴和开发者的共同努力下&#xff0c;鸿蒙生态设备数已达8亿&#xff0c;…

Windows下体验Stable Diffusion 近距离感受AI魔法绘画

🌹作者主页:青花锁 🌹简介:Java领域优质创作者🏆、Java微服务架构公号作者😄 🌹简历模板、学习资料、面试题库、技术互助 🌹文末获取联系方式 📝 往期专栏回顾 专栏描述Java项目实战介绍Java组件安装、使用;手写框架等Aws服务器实战Aws Linux服务器上操作ngin…

快速入门ESP32——移植LVGL(保姆级教程)

相关文章 快速入门ESP32——开发环境配置Arduino IDE 快速入门ESP32——开发环境配置PlatformIO IDE 快速入门ESP32—— platformIO添加开源库和自己的开发库 快速入门ESP32—— 解决platformIO添加开源库下载失败的问题 快速入门ESP32——点亮你的第一个LCD屏幕 快速入门ESP32…

RK3568笔记十五:触摸屏测试

若该文为原创文章&#xff0c;转载请注明原文出处。 使用正点原子的ATK-RK3568板子&#xff0c;一直在测试屏幕和视频&#xff0c;突然想到触摸屏测试&#xff0c;一直没有用过&#xff0c;原子给的demo跑的是QT系统&#xff0c;触摸功能是正常的&#xff0c;测试一下&#xf…

解密ERP业务架构:打造高效运营与持续增长的关键

在当今竞争激烈的商业环境中&#xff0c;企业需要有效管理和整合各个部门的业务流程和信息&#xff0c;以实现高效运营和持续增长。而ERP&#xff08;企业资源规划&#xff09;系统作为一种集成的业务管理平台&#xff0c;扮演着至关重要的角色。本文将探讨ERP业务架构的重要性…

【革新你的社交形象】用AI创意头像应用,让你的头像独一无二!

在这个数字化时代&#xff0c;社交媒体已经成为我们生活中不可或缺的一部分。你是否曾经为了找到一个既能表达自己个性&#xff0c;又足够吸引眼球的头像而苦恼&#xff1f;现在&#xff0c;有了我们全新推出的AI创意头像应用&#xff0c;你的这一困扰将成为过去&#xff01; …

VBA技术资料MF119:数据验证的添加与删除

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

线程池(图解,本质,模拟实现代码)

目录 线程池 介绍 图解 过程 本质 模拟实现 思路 注意点 解决方法 代码 pthread_pool.hpp task.hpp main.cpp 示例 线程池 介绍 线程池是一种并发编程的设计模式&#xff0c;用于管理和重复使用线程&#xff0c;以提高多线程应用程序的性能和效率 线程池主要用于…

C++ “雪花算法“原理

C雪花算法并不是传统的数据结构与算法而是一种崭新的分布式算法 属于深层次C 本篇文章就来描述一下雪花算法 什么是雪花算法: 雪花算法&#xff08;Snowflake&#xff09;是Twitter开源的一种分布式唯一ID生成算法。它可以在不依赖于数据库等其他存储设施的情况下&#xff0c…

指针的经典笔试题

经典的指针试题&#xff0c;让你彻底理解指针 前言 之前对于指针做了一个详解&#xff0c;现在来看一些关于指针的经典面试题。 再次说一下数组名 数组名通常表示的都是首元素的地址&#xff0c;但是有两个意外&#xff0c;1.sizeof&#xff08;数组名&#xff09;这里数组名…

ES入门知识点总结

目录 倒排索引 倒排索引 Elasticsearch的倒排索引是一种数据结构&#xff0c;用于加快基于文本的搜索操作。它的主要优势在于能够快速找到包含特定单词的文档。 倒排索引的构建过程如下&#xff1a; 文档分词&#xff1a;将文档内容分割成单独的词&#xff08;或者更小的词元…

Java的异常体系

一、体系简介 java中的Exception类的子类不仅仅只是像上图所示只包含IOException和RuntimeException这两大类&#xff0c;事实上Exception的子类很多很多&#xff0c;主要可概括为&#xff1a;运行时异常与非运行时异常。 在上述体系中&#xff0c;Error表示严重的系统错误&am…

【前端高频面试题--Vue路由篇】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;前端高频面试题 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac;前端高频面试题--Vue路由篇 对Vue-Router的理解Vue路由懒加载的实现路由的hash和history模式如何获…

车载诊断协议DoIP系列 —— 车辆以太网节点需求汇总

车载诊断协议DoIP系列 —— 车辆以太网节点需求汇总 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师(Wechat:gongkenan2013)。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 本就是小人物,输了就是输了,不要在意别人怎么看自己。江湖一碗茶,…

【剪辑必备】今天我教你如何手动去下载苹果官网4K预告片 完全免费

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;web开发者、设计师、技术分享博主 &#x1f40b; 希望大家多多支持一下, 我们一起学习和进步&#xff01;&#x1f604; &#x1f3c5; 如果文章对你有帮助的话&#xff0c;欢迎评论 &#x1f4ac;点赞&a…

【开源】新生报到网站 JAVA+Vue.js+SpringBoot+MySQL

本文项目编号&#xff1a; T 002 。 \color{red}{本文项目编号&#xff1a;T002。} 本文项目编号&#xff1a;T002。 目录 1 功能模块1.1 在线交流模块1.2宿舍分配模块1.3 校园概况模块1.4 专业管理模块 2 系统展示3 核心代码3.1 图表展示3.2 查询评论3.3 新增报道 4 免责声明 …

儿时游戏“红色警戒”之“AI警戒”

一、红色警戒里“警戒”命令背后的算法原理是什么 在《红色警戒》系列即时战略游戏中&#xff0c;“警戒”命令背后的算法原理相对简单但又实用&#xff0c;其核心目标是让单位能够自动检测并反击一定范围内的敌方单位。虽然具体的实现细节未公开&#xff0c;但可以推测其基本…

【C++】类和对象(五)友元、内部类、匿名对象

前言&#xff1a;前面我们说到类和对象是一个十分漫长的荆棘地&#xff0c;今天我们将走到终点&#xff0c;也就是说我们对于&#xff23;算是正式的入门了。 &#x1f496; 博主CSDN主页:卫卫卫的个人主页 &#x1f49e; &#x1f449; 专栏分类:高质量&#xff23;学习 &…

C#根据权重抽取随机数

&#xff08;游戏中一个很常见的简单功能&#xff0c;比如抽卡抽奖抽道具&#xff0c;或者一个怪物有多种攻击动作&#xff0c;按不同的权重随机出个攻击动作等等……&#xff09; 假如有三种物品 A、B、C&#xff0c;对应的权重分别是A&#xff08;50&#xff09;&#xff0c…