图形数据结构的良好内存管理策略

时间:2012-07-09 21:26:18

标签: c++ memory-management data-structures graph

我曾多次和几个雇主有理由实施我自己的图表数据结构。为了获得完全的访问灵活性,我经常需要使用两个类来实现它,Node类和Edge类。

然后,节点将具有一组传出边(可能还有传入边),并且边将具有源和接收器(两者都是到节点的受管指针)。这些图表经常有周期。

我的问题是:在这种图形数据结构中管理内存的最佳方法是什么,特别是在转换和变换图形时?由于存在周期,它们不适合引用计数(即使你试图使用弱指针,通常也不清楚周期在哪里,因此在哪里放置弱链接。)

在我的各种实现中,我经常跟踪所有分配的节点和边缘,与图形分开,以及图形的入口点列表。然后我实现了一个简单的垃圾收集器。在定期间,应用了各种图形转换(包括取消链接某些节点/边缘),我运行gc,其中涉及:

  1. 从入口点节点开始,并将所有可通过图表到达的节点和边缘标记为活动(通过BFS / DFS)。
  2. 迭代整个集合中的所有节点和边缘,并删除上一步中未标记的任何节点和边缘。
  3. 这很好用(并且是标记/扫描的简单实现)。但它总是看起来有点笨拙。有没有人对这个问题或更好的替代解决方案有任何见解?

1 个答案:

答案 0 :(得分:0)

当您有有限图时,不要将它们表示为指针结构。相反,使用

  • 边缘列表(vectorlist,等等)和顶点列表,或
  • 顶点到索引的映射(mapunordered_map)和布尔值的矩阵(2-d数组)(或加权图的浮点数),表示是否是顶点ij已关联。

前一种表示称为adjacency list,后者称为adjacency matrix。使用哪一个取决于您拥有的图表以及您要执行的操作。两者在内存管理方面都要简单得多,并且通常比指针结构更高效,因为它们占用的内存更少,并且往往保留了引用的局部性。