java 完整子图_如何用很多大的完整子图有效地实现图形? [关闭]

我目前正在处理图形实现的性能问题 .

使用过的技术

它用C编程 . 目前,图表是通过BGL实现的 .

关于图表

托管图是动态的,无向的 . 它有两种结构:很多完整的子图和很少的单边 . 唯一需要的信息是顶点的直接邻域 .

问题陈述

开始时,完整的子图很小(大约10个顶点)和很多(大约13k) . 邻接列表实现,BGL的实现,是完美的 . 但现在,要求管理5000个顶点的少数子图 . 这意味着5000x5000边缘 . 现在,时间和空间的表现非常差 .

拒绝解决方案

我的第一个想法是使用BGL提供的邻接矩阵实现 . 但它不允许动态图 . 要解决此约束,有两种解决方案:为动态图提供邻接矩阵的新实现,或在静态图中使用可用顶点池 . 经过反思,我认为这不是一个好主意:空间复杂度仍然是VxV / 2 .

最终解决方案和问题

所以,这里是我的最终解决方案:不要使用BGL,实现顶点袋来表示完整的子图(不需要边),并直接连接几个单边的顶点 . 通过这样做,最大子图的空间复杂度下降到其顶点数,大约5000 .

你认为最后一个解决方案是好的吗?

如果没有,我可以使用哪种实现方式?为什么?

更新1

有关该图的更多信息:该图具有~100k个顶点,~3k个完整子图约3个顶点,以及~100个完整子图的大小范围[10-5000] . 每个边缘都有捆绑属性 .

更新2

我最近得知Salim Jouilli,节点包是一个坦率的方法hypergraph,其中超级节点包含节点的子集 .

更新3

我已经完成了解决方案 . 我有效地获得了内存消耗和运行时间:从6GB到24MB,从50min到2min30 .

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值