java 有向无环图_数据结构笔记:如何随机生成有向无环图

在验证有向无环图相关的各种算法时需要一些测试数据,手动构造的话太麻烦了,于是便想着能不能自动生成一些测试数据来。这个问题的难点在于如何保证生成的图没有环,查了一下相关资料,这个可以借助拓扑排序的原理来实现,想象一下一个有向无环图要对其拓扑排序,需要从图中找出一个入度为0的顶点,将它和它的出边都从图中删除,重复执行这个操作直到图为空,只需要逆向执行这个过程即可从拓扑排序的结果恢复出一个有向无环图,比如下面这个有向无环图:

a969ff40975faee48c1c618f8d89254b.png

对其拓扑排序的结果是:

a, b, c

那么只需要随机地将前面顶点连接到后面顶点即可将拓扑排序的结果还原为有向无环图,比如随机地从a连向b或c,从b连向c,不过需要注意的是因为拓扑排序会丢失边的信息,所以这个还原并不能保证和原图一致。

下面是针对这个原理写的一个工具类,输入拓扑排序,根据此拓扑排序生成随机有向无环图。

表示顶点和其邻接关系的实体类:

然后是根据拓扑排序生成DAG的工具类:

为了更直观的观察生成的结果,我们将其绘制为图形,这里使用dot language,IDEA可以借助PlatUML插件方便的渲染,这里不是介绍工具或语言的用法的,如有兴趣请自行查阅相关资料。

测试类,将生成结果转换为dot language以渲染:

新建.puml文件,将上面的输出粘贴进去:

查看渲染效果:

58d6edf99d40fc58541b6825dea63055.png

通过图形渲染,能够更直观的看到,生成的确实是一个有向无环图,至此实现了测试数据可以自动生成,下面的实验可以开心的继续下去了。

.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值