关于使用拓扑排序算法实现解析勾稽关系优先级的研究和实现

1. 勾稽关系

勾稽关系(Reconciliation Relationship)是一个财务术语,指的是在会计和审计中,不同会计报表或报表项目之间存在的逻辑对应关系。这种关系可以用来验证会计数据的准确性和完整性。勾稽关系通常体现在以下几个方面:

  1. 会计等式:资产 = 负债 + 所有者权益,这是会计的基本等式,也是最基础的勾稽关系。即 3 = 1+2 , 4 = 5+ 2 , 7 = 1 + 6 .

这里的勾稽关系:  有

2.拓扑排序

简单来说就是一个有向图,如果图中有入度为 0 的点,就把这个点删掉,同时也删掉这个点所连的边。一直进行上面出处理,如果所有点都能被删掉,则这个图可以进行拓扑排序。

举例子

开始时,图是这样的状态,发现A的入度为 0,所以删除A和A上所连的边,结果如下图:

这时发现B的入度为 0,C的入度为 0,所以删除B和B上所连的边、C和C上所连的边,结果如下图:

这时发现发现D的入度为 0,所以删除D和D上所连的边(如果有就删),结果如下图:、

这时整个图被删除干净,所有能进行拓扑排序。

首先记录各个点的入度

然后将入度为 0 的点放入队列

将队列里的点依次出队列,然后找出所有出队列这个点发出的边,删除边,同事边的另一侧的点的入度 -1。

如果所有点都进过队列,则可以拓扑排序,输出所有顶点。否则输出-1,代表不可以进行拓扑排序。

拓扑排序的实现(java)
import java.util.Scanner;
import java.util.Queue;
import java.util.LinkedList;
public class Main{static int N = 100010;static int[] h = new int[N];       //以第一个节点的编号为索引,存储所有单链表的头节点static int[] e = new int[N];       //以当前要操作的节点为索引,存储第二个节点的编号static int[] ne = new int[N];      //以当前操作的节点为索引,存储下一个节点static int[] d = new int[N];       //存储i号节点的入度static int[] top = new int[N];static Queue<Integer> q = new LinkedList<>();static int idx,n,cnt = 1;         //cnt指的是top中有多少元素public static void main(String[] args){Scanner in = new Scanner(System.in);n = in.nextInt();int m = in.nextInt();for(int i = 0; i < N; i ++) h[i] = -1;for(int i = 0; i < m; i ++){int a = in.nextInt();int b = in.nextInt();add(a,b);d[b]++;                    //入度+1}if(topsort()){for(int i = 1; i <= n; i ++) System.out.print(top[i] + " ");}else System.out.print("-1");}private static void add(int a ,int b){e[idx] = b;ne[idx] = h[a];h[a] = idx++;}private static boolean topsort(){for(int i = 1; i <= n; i ++)             //因为是从1开始编号的,所以从1开始遍历{if(d[i] == 0) q.offer(i);            //遍历每个节点,入度为0就入栈}while(q.size() != 0){int t = q.poll();top[cnt] = t;cnt++;for(int i =h[t]; i != -1; i = ne[i])  //遍历链表,删除1的所有出度{int j = e[i];                     //j找到第一个节点指向的点bif(--d[j] == 0) q.offer(j);       //删除边}}return cnt >= n;                          //注意这里一定是>=,因为cnt = 3以后会++等于4}
}

3. 勾稽关系抽象成有向图

通过对勾稽关系的理解,其本质类似一种层级依赖关系,凡有层级依赖关系且是有向的依赖关系,因此可以抽象成一种树形结构,而勾稽关系的优先级恰好就是当前节点到最远的叶子节点的距离。因此可以在求拓扑排序的过程中求得。

其中 1= 2+3, 4 = 5+ 2 , 7 = 1 + 6 

如下图 :

代码实现: 在求拓扑排序的过程中实现计算当前树节点的优先级

      while(hh<=tt){int t = q[hh++];for(int i = h[t];i!=-1;i=ne[i]){int j = e[i];// 优先级获取的核心逻辑sort[j] =Math.max(sort[j],sort[t]+1) ;System.out.println("j-->sort[j] "+j+"-->"+sort[j]);System.out.println("t ----> j: "+t+"-->"+j);if(--d[j] == 0){q[++tt] = j;}}}

最终的优先级关系:

2 -> 1

3 -> 1

1 -> 2

5 -> 1

6 -> 1

7 -> 3

5.完整代码:

import java.util.Arrays;/*** @author 16905*/
public class MyExpressionResolver {public  final  int N = (int)5e3;public  int n,m,idx;public  int[] ne=  new int[N];public  int[] e = new int[N];public int[] h = new int[N];public int[] q = new int[N];public int[] d = new int[N];public int[] sort = new int[N];int ans=N;//  链表头节点添加public void add(int a, int b){e[idx] = b;ne[idx] = h[a];h[a]= idx++;}/*** 拓扑排序* @return*/public int[] trop(){Arrays.fill(sort,0);
//  这里用到了 数组模拟队列int tt =-1,hh = 0;for(int i=1;i<=n;i++){if(d[i]==0){q[++tt] = i;}}while(hh<=tt){int t = q[hh++];for(int i = h[t];i!=-1;i=ne[i]){int j = e[i];// 优先级获取的核心逻辑sort[j] =Math.max(sort[j],sort[t]+1) ;System.out.println("j-->sort[j] "+j+"-->"+sort[j]);System.out.println("t ----> j: "+t+"-->"+j);if(--d[j] == 0){q[++tt] = j;}}}int[] sortEnd = new int[n+1];if(tt==n-1){System.out.print("得到拓扑序: ");for(int i=0;i<n;i++){System.out.printf("%d ",q[i]);}System.out.println();System.out.print("节点 :  ");for(int i = 0,j=0; i<= n; i++){// 得到优先级System.out.printf("%d ",i);}  System.out.println();System.out.print("优先级: ");for(int i = 0,j=0; i<= n; i++){// 得到优先级System.out.printf("%d ",sort[i]+1);sortEnd[j++] = sort[i];}}return sortEnd;}public static void main(String[] args) {MyExpressionResolver myExpressionResolver = new MyExpressionResolver();Arrays.fill(myExpressionResolver.h,-1);// 1->4 4++// 5->4// 2->1 1++// 3->1// 1->7 7++// 6->7String[] test = new String[]{"1=2+3","4=2+5","7=1+6"};for (String s : test) {String[] split = s.split("=");String replace = split[1].replace("+", "-").replace("*", "-").replace("/", "-");String[] rightValue = replace.split("-");int left = Integer.parseInt(split[0]);for (String right : rightValue) {myExpressionResolver.d[left] ++;myExpressionResolver.add(Integer.parseInt(right),left);}}//             7//            / \//      4    1   6//     / \  / \//     5   2   3myExpressionResolver.n = 7;int[] sortAns = myExpressionResolver.trop();System.out.println();System.out.print("得到最终的节点优先级:");for (int sortAn : sortAns) {System.out.print( " "+sortAn );}System.out.println();}}

 程序运行结果:(观察可得与实际结果一致)

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

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

相关文章

电商项目-网站首页高可用(二)

一、LUA基本语法 lua有交互式编程和脚本式编程。 交互式编程就是直接输入语法&#xff0c;就能执行。 脚本式编程需要编写脚本文件&#xff0c;然后再执行。 一般采用脚本式编程。&#xff08;例如&#xff1a;编写一个hello.lua的文件&#xff0c;输入文件内容&#xff0c;并执…

flink实现复杂kafka数据读取

接上文&#xff1a;一文说清flink从编码到部署上线 环境说明&#xff1a;MySQL&#xff1a;5.7&#xff1b;flink&#xff1a;1.14.0&#xff1b;hadoop&#xff1a;3.0.0&#xff1b;操作系统&#xff1a;CentOS 7.6&#xff1b;JDK&#xff1a;1.8.0_401。 常见的文章中&…

第十五届蓝桥杯Scratch01月stema选拔赛—排序

排序 具体要求&#xff1a; 1). 点击绿旗&#xff0c;在舞台上出现4张点数不同的扑克牌&#xff0c;牌上的点数是随机的&#xff08;4-9点&#xff09;&#xff0c;如图所示&#xff1b; 完整题目可点击下方链接查看&#xff1a; 排序_scratch_嗨信奥-玩嗨信息奥林匹克竞赛-…

图形学笔记 - 5. 光线追踪2 - 加速结构

目录 使用AABB加速光线追踪 Uniform Spatial Partitions (Grids) 均匀空间划分 空间划分 KD树预处理 KD-Tree数据结构 遍历kd树 对象划分 & Bounding Volume Hierarchy 层次包围盒 BVH BVH遍历 空间划分与物体划分呢 GTC news: DLSS、RTXGI 实时光线追踪 使用AAB…

计算机毕业设计原创定制(免费送源码):NodeJS+MVVM+MySQL 樱花在线视频网站

目 录 摘要 1 1 绪论 1 1.1研究背景 1 1.2系统设计思想 1 1.3B/S体系工作原理 1 1.4node.js主要功能 2 1.5论文结构与章节安排 3 2 樱花在线视频网站分析 4 2.1 可行性分析 4 2.2 系统流程分析 4 2.2.1数据增加流程 5 2.3.2数据修改流程 5 2.3.3数据删除流程 5 …

SpringBoot 启动类 SpringApplication 二 run方法

配置 在Program arguments配置2个参数&#xff1a;--server.port8081 --spring.profiles.activedev。 run方法 run方法执行结束代表SpringBoot启动完成&#xff0c;即完成加载bean。 // ConfigurableApplicationContext 是IOC容器 public ConfigurableApplicationContext ru…

如何调大unity软件的字体

一、解决的问题&#xff1a; unity软件的字体太小&#xff0c;怎么调大点&#xff1f;二、解决方法&#xff1a; 1.操作步骤&#xff1a; 打开Unity编辑器> Edit>preferences> UI Scaling>Use custom scaling value&#xff08;取消勾选“使用默认桌面设置”&…

SYD881X RTC定时器事件在调用timeAppClockSet后会出现比较大的延迟

RTC定时器事件在调用timeAppClockSet后会出现比较大的延迟 这里RTC做了两个定时器一个是12秒,一个是185秒: #define RTCEVT_NUM ((uint8_t) 0x02)//当前定时器事件数#define RTCEVT_12S ((uint32_t) 0x0000002)//定时器1s事件 /*整分钟定时器事件&#xff0c;因为其余的…

内置函数.

日期函数 current_date/time() 日期/时间 获得年月日&#xff1a; 获得时分秒&#xff1a; 获得时间戳&#xff1a;日期时间 now()函数 体会date(datetime)的用法&#xff1a;只显示日期 在日期的基础上加日期&#xff1a;按照日历自动计算 关键字为 intervalinterval 后的数值…

PHP 微信棋牌开发全解析:高级教程

PHP - 多维数组详解 多维数组是 PHP 中一种强大的数据结构&#xff0c;指的是一个数组的元素中可以包含一个或多个数组。它常用于存储复杂的嵌套数据&#xff0c;如表格数据或多层次关系的数据结构。 注释&#xff1a; 数组的维度表示您需要指定索引的层级数&#xff0c;以访问…

【Java】递归算法

递归的本质&#xff1a; 方法调用自身。 案例1. 斐波那契数列 1 1 2 3 5 8 13 21 .. f(n)f(n-1)f(n-2) 方法的返回值&#xff1a; 只要涉及到加减乘除&#xff0c;就是int,其他的就是void。 案例2. 青蛙跳台 青蛙一次可以跳一级台阶&#xff0c;也可以跳两级台阶&#xff…

JVM简介—1.Java内存区域

大纲 1.运行时数据区的介绍 2.运行时数据区各区域的作用 3.各个版本内存区域的变化 4.直接内存的使用和作用 5.站在线程的角度看Java内存区域 6.深入分析堆和栈的区别 7.方法的出入栈和栈上分配、逃逸分析及TLAB 8.虚拟机中的对象创建步骤 9.对象的内存布局 10.对象的…

大腾智能CAD:国产云原生三维设计新选择

在快速发展的工业设计领域&#xff0c;CAD软件已成为不可或缺的核心工具。它通过强大的建模、分析、优化等功能&#xff0c;不仅显著提升了设计效率与精度&#xff0c;还促进了设计思维的创新与拓展&#xff0c;为产品从概念构想到实体制造的全过程提供了强有力的技术支持。然而…

设计模式の享元模板代理模式

文章目录 前言一、享元模式二、模板方法模式三、代理模式3.1、静态代理3.2、JDK动态代理3.3、Cglib动态代理3.4、小结 前言 本篇是关于设计模式中享元模式、模板模式、以及代理模式的学习笔记。 一、享元模式 享元模式是一种结构型设计模式&#xff0c;目的是为了相似对象的复用…

Linux网络功能 - 服务和客户端程序CS架构和简单web服务示例

By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 目录 概述准备工作扫描服务端有那些开放端口创建客户端-服务器设置启动服务器和客户端进程双向发送数据保持服务器进程处于活动状态设置最小…

用人话讲计算机:Python篇!(十五)迭代器、生成器、装饰器

一、迭代器 &#xff08;1&#xff09;定义 标准解释&#xff1a;迭代器是 Python 中实现了迭代协议的对象&#xff0c;即提供__iter__()和 __next__()方法&#xff0c;任何实现了这两个方法的对象都可以被称为迭代器。 所谓__iter__()&#xff0c;即返回迭代器自身 所谓__…

小程序快速实现大模型聊天机器人

需求分析&#xff1a; 基于大模型&#xff0c;打造一个聊天机器人&#xff1b;使用开放API快速搭建&#xff0c;例如&#xff1a;讯飞星火&#xff1b;先实现UI展示&#xff0c;在接入API。 最终实现效果如下&#xff1a; 一.聊天机器人UI部分 1. 创建微信小程序&#xff0c…

【Android】unzip aar删除冲突classes再zip

# 解压JAR文件 jar xf your-library.jar # 解压AAR文件&#xff08;AAR实际上是ZIP格式&#xff09; unzip your-library.aar # 删除不需要的类 rm -rf path/to/com/example/unwanted/ # 对于JAR打包 jar cf your-library-modified.jar -C path/to/unzipped/ . # 对于AAR打包…

使用C语言编写UDP循环接收并打印消息的程序

使用C语言编写UDP循环接收并打印消息的程序 前提条件程序概述伪代码C语言实现编译和运行C改进之自由设定端口注意事项在本文中,我们将展示如何使用C语言编写一个简单的UDP服务器程序,该程序将循环接收来自指定端口的UDP消息,并将接收到的消息打印到控制台。我们将使用POSIX套…

你的第一个博客-第一弹

使用 Flask 开发博客 Flask 是一个轻量级的 Web 框架&#xff0c;适合小型应用和学习项目。我们将通过 Flask 开发一个简单的博客系统&#xff0c;支持用户注册、登录、发布文章等功能。 步骤&#xff1a; 安装 Flask 和其他必要库&#xff1a; 在开发博客之前&#xff0c;首…