我目前正在处理图形实现的性能问题 .
使用过的技术
它用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 .