日撸 Java 三百行day39

news2024/11/25 6:54:41

文章目录

  • 说明
  • day39 关键路径
    • 1.关键路径
    • 2. 代码分析

说明

闵老师的文章链接: 日撸 Java 三百行(总述)_minfanphd的博客-CSDN博客
自己也把手敲的代码放在了github上维护:https://github.com/fulisha-ok/sampledata

day39 关键路径

1.关键路径

  • AOV网 顶点表示活动的网络,且每个活动是有前驱和后继关系存在的。
  • AOE网 用边表示活动的网络,顶点表示事件,有向边表示活动,边上的权值表示完成活动需要的时间
  • 从开始节点到到各个顶点所有路径中,最大路径长度的路径是关键路径(一般简单的图可以直接看出来那些是关键路径,但是复杂的就需要进行计算了) 求关键路径过程中会涉及事件(顶点)Vi最早发生时间和最迟发生时间;活动(边)最早发生时间和最迟发生时间。
    结合一个例子来说明。(例子网上找的)
    在求关键路径时,把每个顶点(事件)的最早和最晚发生时间算出,如果最早和最晚相等即可求出关键路径。去计算活动最早和最晚发生时间进而可以求出关键路径上的关键活动。
    在这里插入图片描述

如图为各个顶点的最早最晚发生时间:
在这里插入图片描述
关键路径上的节点:1,3,4,6

各个活动的最早最晚发生时间(结合顶点的最早和最晚好观察些):
a1,a2最早开始时间看1节点最早时间,a3最早开始时间看2最早开始时间…a7看节点4最早时间
a1看节点2最迟发生时间是4,4-3=1,a2看节点3最迟发生时间2-2=0…a7看节点6最迟发生时间8-2=6

在这里插入图片描述
关键活动为a2->a5->a7

2. 代码分析

  • 1.算出各个节点的入度,找到入度为0的节点
  • 2.从入度为0节点开始,到每个顶点的最早开始时间,并用数组记录(注意:有多个顶点汇聚到一个顶点,要找其中最大的那个最为最早开始时间。这就好比组装车,a组装发动机,b组装车身底盘,c组装车架,只有三者都完成,才能开始进行d 组装整个车,d最早开始时间要看a,b,c中最晚时间)
  • 3.算出各个节点的出度,找到出度为0的节点,
  • 4.从出度为0的节点开始,到每个顶点的最晚开始时间,在拓扑排序是正着找入度为0的就移除掉这个顶点,接着再找入度为0的,再这里我们可以将拓扑排序反着来,找出度为0再移除,这样我们就能去找最晚时间。节点最晚时间是看这个节点所有的后继节点到终点最长的的时间那个。
 /**
     * Critical path. Net validity checks such as loop check not implemented.
     * The source should be 0 and the destination should be n-1.
     */
    public boolean[] criticalPath(){
        //One more value to save simple computation.
        int tempValue;

        //step1. the in-degree of each code
        int[] tempInDegrees = new int[numNodes];
        for (int i = 0; i < numNodes; i++) {
            for (int j = 0; j < numNodes; j++) {
                if (weightMatrix.getValue(i, j) != -1) {
                    tempInDegrees[j]++;
                }
            }
        }
        System.out.println("In-degree of nodes: " + Arrays.toString(tempInDegrees));

        //step2 Topology sorting
        int[] tempEarliestTimeArray = new int[numNodes];
        for (int i = 0; i < numNodes; i++) {
            if (tempInDegrees[i] > 0) {
                continue;
            }
            System.out.println("Removing " + i);

            for (int j = 0; j < numNodes; j++) {
                if (weightMatrix.getValue(i, j) != -1) {
                    tempValue = tempEarliestTimeArray[i] + weightMatrix.getValue(i, j);
                    if (tempEarliestTimeArray[j] < tempValue) {
                        tempEarliestTimeArray[j] = tempValue;
                    }
                    tempInDegrees[j]--;
                }
            }
        }

        System.out.println("Earliest start time: " + Arrays.toString(tempEarliestTimeArray));

        //step3.The out-degree of each node.
        int[] tempOutDegrees = new int[numNodes];
        for (int i = 0; i < numNodes; i++) {
            for (int j = 0; j < numNodes; j++) {
                if (weightMatrix.getValue(i, j) != -1) {
                    tempOutDegrees[i]++;
                }
            }
        }
        System.out.println("Out-degree of nodes: " + Arrays.toString(tempOutDegrees));

        //step4. reverse topology sorting
        int[] tempLatestTimeArray = new int[numNodes];
        for (int i = 0; i < numNodes; i++) {
            tempLatestTimeArray[i] = tempEarliestTimeArray[numNodes - 1];
        }

        for (int i = numNodes -1; i >=0; i--) {
            // This node cannot be removed.
            if (tempOutDegrees[i] > 0) {
                continue;
            }
            System.out.println("Removing " + i);

            for (int j = 0; j < numNodes; j++) {
                if (weightMatrix.getValue(j, i) != -1) {
                    tempValue = tempLatestTimeArray[i] - weightMatrix.getValue(j, i);
                    if (tempLatestTimeArray[j] > tempValue) {
                        tempLatestTimeArray[j] = tempValue;
                    }
                    tempOutDegrees[j]--;
                    System.out.println("The out-degree of " + j + " decreases by 1.");
                }
            }

        }
        System.out.println("Latest start time: " + Arrays.toString(tempLatestTimeArray));
        boolean[] resultCriticalArray = new boolean[numNodes];
        for (int i = 0; i < numNodes; i++) {
            if (tempEarliestTimeArray[i] == tempLatestTimeArray[i]) {
                resultCriticalArray[i] = true;
            }
        }

        System.out.println("Critical array: " + Arrays.toString(resultCriticalArray));
        System.out.print("Critical nodes: ");
        for (int i = 0; i < numNodes; i++) {
            if (resultCriticalArray[i]) {
                System.out.print(" " + i);
            }
        }
        System.out.println();

        return resultCriticalArray;
    }

在求关键路径的代码中,计算每一个结点的入度和出度,这还是比较简单,只是赋值的时候是i还是j有区别;计算每一个结点最早开始时间(tempEarliestTimeArray)采用拓扑排序思想,计算每一个结点最晚开始时间(tempLatestTimeArray)采用逆拓扑排序思想;在实现关键路径代码的过程中,每一个步骤都是清晰明了,他们之间的耦合性不大。在求节点最早和最晚时间时,用拓扑排序思想(正反)去求解这个思路学习到了。这突然让我想到Day26写的后序遍历算法,结合栈采用逆向思维输出~

  • 单元测试
    虽然代码几个循环就写出来,我还是准备根据代码debug出相应的过程更容易去理解。
    根据测试中画出的图例(在线画图工具)
    在这里插入图片描述
    根据图例画出矩阵:
    Δ 0 1 2 3 4 5 0 − 1 3 2 − 1 − 1 − 1 1 − 1 − 1 − 1 2 3 − 1 2 − 1 − 1 − 1 4 − 1 3 3 − 1 − 1 − 1 − 1 − 1 2 4 − 1 − 1 − 1 − 1 − 1 1 5 − 1 − 1 − 1 − 1 − 1 − 1 \begin{array}{c} % 总表格 \begin{array}{c|cccc} % 第二行 Delta 值数组 \Delta & 0 & 1 & 2 & 3 & 4 & 5\\ \hline 0 & -1 & 3 & 2 & -1 & -1 & -1 \\ 1 & -1 & -1 & -1 & 2 & 3 & -1 \\ 2 & -1 & -1 & -1& 4 & -1 & 3 \\ 3 & -1 & -1 & -1 & -1 & -1 & 2 \\ 4 & -1 & -1 & -1 & -1 & -1 & 1\\ 5 & -1 & -1 & -1 & -1 & -1 & -1 \\ \end{array} % 第二行表格结束 \end{array} % 总表格结束 Δ012345011111113111112211111312411141311115113211

  • 1.各结点的入度
    在这里插入图片描述

  • 2.从入度为0节点开始,到每个顶点的最早开始时间,并用数组记录
    在这里插入图片描述

  • 3…算出各个节点的出度,找到出度为0的节点,
    在这里插入图片描述

  • 4.从出度为0的节点开始,到每个顶点的最晚开始时间
    在这里插入图片描述

  • 算出最晚和最早相等的
    在这里插入图片描述

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

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

相关文章

PMP课堂模拟题目及解析(第1期)

1.在一个大型施工项目的规划阶段&#xff0c;出现了潜在的经济衰退迹象。之前关于经济衰退的风险被指定为低概率和高影响&#xff0c;预计持续 6-12 个月。项目开始后不久 发生了经济衰退&#xff0c;并按预期影响项目。六个月后&#xff0c;经济衰退影响的持续时间将更改为 24…

网络通信与密码相关概念流程

文章目录 前言一、明文通信二、密文通信1.对称加密2.非对称加密 三、安全信任机制1.CA(Certificate Authority) 证书授权中心2.数字证书 总结 前言 随着科技的发展&#xff0c;人们的通信都转化成电子通信&#xff0c;由于信息需要通过一个公有的网络进行传输&#xff0c;信息…

Spring IOC 源码解读

将回答以下问题&#xff1a; BeanFactory 和 ApplicationContext 之间的关系和区别。一个 Bean 是如何被注入到 IOC 容器里&#xff0c;中间经历了什么过程&#xff08;Bean 的生命周期&#xff09;。 先入为主 假设你已经有如下经验&#xff1a; 什么是 IOC。 don‘t call…

verilog手撕代码2——各种加法器介绍——真值表、表达式、电路图

文章目录 前言一、半加器二、全加器三、串行/行波进位加法器&#xff08;Ripple-Carry Adder/RCA&#xff09;四、超前进位加法器&#xff08;Lookahead Carry Adder/LCA&#xff09;五、进位保存加法器&#xff08;Carry Save Adder/CSA&#xff09; 前言 2023.4.25 一、半加…

Terraform

文章目录 简介安装简单使用案例 概念原理状态管理Backend 远程状态存储机制 配置语法Argument 参数Block 块terraform块required_providersbackend provider块: 与基础设施交互resource块: 定义基础架构data块: 数据源 表达式(Experssion)和函数(Functions)变量variable 输入变…

【Celery】任务Failure或一直超时Pending

编写背景 task进入队列后&#xff0c;部分任务出现Failure或者一直Pending,且业务代码没有报错。 运行环境 celery配置 from celery import Celery broker redis://:127.0.0.1:6379/1 backend redis://:127.0.0.1:6379/2 app Celery(brokerbroker,backendbackend,includ…

【文心一言】广告文案、演讲稿与请假条自动生成

前言 作为一名大学生而言&#xff0c;平时参加或者举办一些学校组织的活动的时候&#xff0c;总是避免不了需要准备一些演讲稿、广告宣传文案等内容&#xff0c;甚至于在疫情十分严重的这几年内&#xff0c;如何跟老师“委婉的”请假&#xff0c;也成为了我日常头疼的事情。但在…

React之redux的模板

文章目录 以下为模板代码安装(添加 Redux Toolkit 和 React-Redux 依赖包到你的项目中)以下为项目目录在store/index.js里面的模板创建模块(模块化思想),这里就是模板,所有模块通用(src/features/userSlice.js)在main.jsx引入模板(只需要看下面画横线的四行)在组件内使用 以下是…

【网课平台】Day16.项目优化:压测、加缓存优化与分布式锁

文章目录 一、压力测试1、优化需求2、性能指标3、安装Jmeter4、压力测试5、优化日志 二、缓存优化1、给接口加Redis缓存2、缓存穿透3、解决缓存穿透4、缓存雪崩5、缓存击穿 三、分布式锁1、本地锁的问题2、IDEA一个项目启动多个实例3、分布式锁4、Redis NX实现分布式锁5、Redis…

多项式加法(用 C 语言实现)

目录 一、多项式的初始化 二、多项式的创建 三、多项式的加法 四、多项式的输出 五、清除链表 六、主函数 用链表实现多项式时&#xff0c;每个链表节点存储多项式中的一个非零项&#xff0c;包括系数&#xff08;coef&#xff09;和指数&#xff08;exp&#xff09;两个…

Java8新特性函数式编程 - Lambda、Stream流、Optional

1.Lambda表达式 1.1 概述 ​ Lambda是JDK8中一个语法糖。他可以对某些匿名内部类的写法进行简化。它是函数式编程思想的一个重要体现。让我们不用关注是什么对象。而是更关注我们对数据进行了什么操作。 1.2 核心原则 可推导可省略 1.3 基本格式 (参数列表)->{代码}例一…

python毕业设计之django+vue公司企业物流信息管理系统

基于 开发语言&#xff1a;Python 框架&#xff1a;django Python版本&#xff1a;python3.7.7 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat 开发软件&#xff1a;PyCharm 语言设计并实现了速运公司物流信息管理系统。该系统基于B/S即所谓浏览器/服务器模式&…

智慧物流信息系统开发需具备哪些功能?

智慧物流软件开发公司在制作管理系统的时候&#xff0c;需要具备的功能有哪些呢&#xff1f; 一、采集跟踪功能。 &#xff08;1&#xff09;、信息采集&#xff1a;信息采集跟踪系统是智能物流系统的重要组成部分。物流信息采集系统主要由RFID射频识别系统和Savan…

【Hadoop-HDFS】HDFS中Fsimage与Edits详解

【Hadoop-HDFS】HDFS中Fsimage与Edits详解 1&#xff09;概述2&#xff09;NameNode元数据解析3&#xff09;Fsimage3.1.Fsimage 的作用3.2.FSimage 的文件信息查看 4&#xff09;Edits4.1.Edits 的作用4.2.Edits 的文件信息查看 5&#xff09;元数据信息目录的配置 1&#xff…

【2023.04.28】Windows配置MongoDB服务

【2023.04.28】Windows配置MongoDB服务 1、背景2、操作2.1 配置环境变量2.2 配置本地Windows MongoDB服务 环境&#xff1a;Windows11&#xff0c;Mongo 6.0.5【该版本没有mongo.exe】 1、背景 某一天想使用电脑以前安装的 MongoDB&#xff0c;发现用 Navicat 连接不了&#…

4个很多人都不知道的现代JavaScript技巧

JavaScript在不断的进化和升级&#xff0c;越来越多的新特性让我们的代码变得更加简洁。因此&#xff0c;今天这篇文章&#xff0c;我将跟大家分享 4 个不常用的 JavaScript 运算符。让我们一起研究它们。 1.可选的链接运算符 这个功能非常好用&#xff0c;它可以防止我的代码…

pwm调节亮度

文章目录 运行环境&#xff1a;1.1 pwm1)占空比2)A板原理图3)PE11引脚配置4)定时器Timers配置 2.1代码解释1)定时器1初始化函数2)启动定时器中断3)启动PWM/设置占空比4)launch设置5) 编译调试 3.1实验效果 运行环境&#xff1a; ubuntu18.04.melodic 宏基暗影骑士笔记本 stm32…

Leetcode202. 快乐数

Every day a leetcode 题目来源&#xff1a;202. 快乐数 解法1&#xff1a;hash 根据几个例子&#xff0c;我们发现只有2种结果&#xff1a; 最终会得到1最终进入一个循环 其实得到1后&#xff0c;继续计算&#xff08;将该数替换为它每个位置上的数字的平方和&#xff09…

美妆“数字员工”来了!丸美:每月节省30人日!提升员工幸福感,企业效益稳增

美妆&#xff0c;因其效果可视觉化呈现的特征&#xff0c;决定了美妆品牌与直播带货的高匹配度。流量&#xff0c;是直播商家深入了解粉丝参与情况和商品销售状况的重要依据。因此&#xff0c;美妆商家需要每天下载直播数据报表&#xff0c;监测流量、成交变化趋势&#xff0c;…

数据可视化 —— 小练习1 KMeans聚类并数据可视化图像像素点

数据可视化Task1 任务描述&#xff1a;对图片RGB点进行Kmeans聚类&#xff0c;并将结果数据可视化于前端浏览器上 实验平台&#xff1a; Visual Studio CodeHTML/CSS/JavascriptEdge/Chorme/Firefox 浏览器Echart.min.js 3.8.5版 &#xff08;过高的版本浏览器无法include&a…