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), 则为关键活动。

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

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

相关文章

DataX源码分析-插件机制

系列文章目录 一、DataX详解和架构介绍 二、DataX源码分析 JobContainer 三、DataX源码分析 TaskGroupContainer 四、DataX源码分析 TaskExecutor 五、DataX源码分析 reader 六、DataX源码分析 writer 七、DataX源码分析 Channel 八、DataX源码分析-插件机制 文章目录 系列文章…

基于GPT一键完成数据分析全流程的AI Agent: Streamline Analyst

大型语言模型&#xff08;LLM&#xff09;的兴起不仅为获取知识和解决问题开辟了新的可能性&#xff0c;而且催生了一些新型智能系统&#xff0c;例如旨在辅助用户完成特定任务的AI Copilot以及旨在自动化和自主执行复杂任务的AI Agent&#xff0c;使得编程、创作等任务变得高效…

Prompt Tuning:深度解读一种新的微调范式

阅读该博客&#xff0c;您将系统地掌握如下知识点&#xff1a; 什么是预训练语言模型&#xff1f; 什么是prompt&#xff1f;为什么要引入prompt&#xff1f;相比传统fine-tuning有什么优势&#xff1f; 自20年底开始&#xff0c;prompt的发展历程&#xff0c;哪些经典的代表…

CV | Segment Anything论文详解及代码实现

本文主要是详解解释了SAM的论文部分以及代码实现~ 论文&#xff1a;2023.04.05_Segment Anything 论文地址&#xff1a;2304.02643.pdf (arxiv.org) 代码地址&#xff1a;facebookresearch/segment-anything: The repository provides code for running inference with the Seg…

随机过程及应用学习笔记(四) 马尔可夫过程

马尔可夫过程是理论上和实际应用中都十分重要的一类随机过程。 目录 前言 一、马尔可夫过程的概念 二、离散参数马氏链 1 定义 2 齐次马尔可夫链 3 齐次马尔可夫链的性质 三、齐次马尔可夫链状态的分类 四、有限马尔可夫链 五、状态的周期性 六、极限定理 七、生灭过…

接口测试方法论

第1章 测试那点事 单元测试》接口测试》界面测试 接口就是包含特定输入和特定输出的一套逻辑处理单元&#xff0c;用户无须知晓接口的内部实现逻辑&#xff0c;这也可以称为接口的黑河处理逻辑。因为服务对象不同&#xff0c;接口又可分为两种&#xff1a;一种是系统或服务的…

K8S集群实践之十:虚拟机部署阶段性总结

目录 1. 说明&#xff1a; 2. 安装准备 2.1 每个节点设置双网卡&#xff0c;一卡做网桥&#xff08;外部访问&#xff09;&#xff0c;一卡做NAT&#xff08;集群内网访问&#xff09; 2.2 准备一个可用的代理服务器 3. 由于虚拟机崩溃&#xff08;停电&#xff0c;宿主机…

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

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

《苍穹外卖》知识梳理p7-用户下单与模拟微信支付

用户下单与微信支付 一.用户下单 1.1 订单表的设计 订单功能是一个核心的功能&#xff1b; 需要使用2张表&#xff1a; 1.订单表&#xff1a;记录一些订单信息&#xff0c;比如收货人&#xff0c;收获地址&#xff0c;支付金额&#xff0c;下单时间等&#xff1b; 2.订单详情…

GitLab配置SSHKey

段落一&#xff1a;什么是SSH密钥 SSH&#xff08;Secure Shell&#xff09;是一种网络协议&#xff0c;用于安全地远程登录和执行命令。SSH密钥是一种用于身份验证的加密文件&#xff0c;它允许您在与远程服务器通信时&#xff0c;无需输入密码即可进行认证。在GitLab中配置S…

Kibana:如何嵌入 Kibana 仪表板

作者&#xff1a;Carly Richmond 像我这样的前端工程师经常提出的要求是将 Kibana 等来源的现有仪表板嵌入到 JavaScript Web 应用程序中。 这是我必须多次执行的任务&#xff0c;因为我们希望快速部署用户生成的视图或允许用户控制给定的视图。 从我们从精彩的开发者社区收到的…

JVM(3)高级篇

1 GraalVM 1.1 什么是GraalVM GraalVM是Oracle官方推出的一款高性能JDK&#xff0c;使用它享受比OpenJDK或者OracleJDK更好的性能。 GraalVM的官方网址&#xff1a;https://www.graalvm.org/ 官方标语&#xff1a;Build faster, smaller, leaner applications。 更低的CPU、内…

Sora技术报告——Video generation models as world simulators

文章目录 1. 视频生成模型&#xff0c;可以视为一个世界模拟器2. 技术内容2.1 将可视数据转换成patches2.2 视频压缩网络2.3 Spacetime Latent Patches2.4 Scaling transformers 用于视频生成2.5 可变的持续时间&#xff0c;分辨率&#xff0c;宽高比2.6 抽样的灵活性2.7 改进框…

Invalid DataSize: cannot convert ‘30Mb‘ to Long

Invalid DataSize: cannot convert 30Mb to Long servlet:multipart:max-file-size: 30MBmax-request-size: 30MB

【研究生复试】计算机软件工程人工智能研究生复试——资料整理(速记版)——计算机网络

1、JAVA 2、计算机网络 3、计算机体系结构 4、数据库 5、计算机租场原理 6、软件工程 7、大数据 8、英文 自我介绍 2. 计算机网络 1. TCP如何解决丢包和乱序&#xff1f; 序列号&#xff1a;TCP所传送的每段数据都有标有序列号&#xff0c;避免乱序问题发送端确认应答、超时…

反向迭代器------封装的力量

目录 一、list封装中模板参数Ref和Ptr的理解 二、反向迭代器的实现 一、list封装中模板参数Ref和Ptr的理解 对于反向迭代器&#xff0c;是我们在前面STL模拟实现中留下的一个问题。在之前的文章中&#xff0c;我们极大程度上的利用了模板&#xff0c;从而减少了许多的代码&…

09、全文检索 -- Solr -- SpringBoot 整合 Spring Data Solr (生成DAO组件 和 实现自定义查询方法)

目录 SpringBoot 整合 Spring Data SolrSpring Data Solr的功能&#xff08;生成DAO组件&#xff09;&#xff1a;Spring Data Solr大致包括如下几方面功能&#xff1a;Query查询&#xff08;属于半自动&#xff09;代码演示&#xff1a;1、演示通过dao组件来保存文档1、实体类…

SpringCloud之Feign发送Http请求

文章目录 http客户端Feign使用步骤自定义Feign的配置Feign的性能优化Feign的性能优化-连接池配置 Feign的最佳实践 http客户端Feign Feign的介绍&#xff1a; Feign是一个声明式的http客户端&#xff0c;官方地址&#xff1a;https:/github.com/OpenFeign/feign 其作用就是帮助…

laravel_进程门面_简单介绍

文章目录 Facade是什么&#xff1f;Facade能干什么Facade有哪些方法&#xff1f;怎么使用Facade呢&#xff1f;详细的代码解释Symfony Process是什么&#xff1f;介绍Symfony总结 Facade是什么&#xff1f; 在 Laravel 框架中&#xff0c;Facade 是一种设计模式。 它提供了一…