dag执行 java实现_如何调用DAG拓扑重组?

我很长时间对直接无环图(DAG)感兴趣,在阅读维基百科的拓扑排序之后,我没有发现任何涉及 layers numbering 的方法的特别提及(尽管图中广泛提到了绘图) . 使用这种方法,图形在技术上不是拓扑排序的,但是知道每个节点包含层(级别)的正确数字,我们总是可以判断特定节点"bigger"是否在拓扑上 . 另一方面,只要我们没有有序列表,我们就无法在拓扑上枚举节点(尽管这可以通过比较节点级别的最终传统排序来完成) .

该方法允许在保持级别信息的正确性的同时实现任意连接 . 步骤可以是:

对于任何新添加的节点(没有任何连接),应用的级别为1 .

如果请求两个节点之间的连接(从m到n)和n.level> m.level,那么它们只是简单地连接,不需要为其他节点修复级别 .

如果对于请求的连接(从m到n)n.level <= m.level然后我们将n.level更改为(m.level 1)并递归检查n的任何依赖关系以获得类似的级别增加(或者如果级别没有增加在递归步骤是兼容的) .

如果我们保留递归输入节点的列表,那么我们可以检测到循环并实现某种撤销操作的尝试(将所有受影响节点的级别返回到先前的值)

对于它们之间的任何已知节点和连接集合,我们只需添加应用level = 1的所有节点,并尝试应用(忽略和撤消cicles)之间的所有已知连接 .

最终级别信息不仅允许在拓扑上比较节点,还包含其他有用信息 . 例如:

level = 1的每个节点都没有传入连接(每个路径都从其中一个开始) . 因此任何DAG枚举都可以从它们开始 .

最长路径(边数)不能长于(最大等级1)

我想对于一些人工数据(n个节点,每个Node(n)连接到Node(n 1)),这个算法可能非常慢 . 但对于真实世界的数据,我尝试了它(维基百科类别 - 800,000个节点 - 2,000,000个连接)时间合适(5-10分钟),水平和周期尝试次数很少(369级,1000次循环尝试)

这个方法是新的还是众所周知的,但是在维基百科和其他资源中没有广泛呈现?既然它不是一种(技术上),它应该被称为数据重组吗?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值