我曾多次和几个雇主有理由实施我自己的图表数据结构。为了获得完全的访问灵活性,我经常需要使用两个类来实现它,Node
类和Edge
类。
然后,节点将具有一组传出边(可能还有传入边),并且边将具有源和接收器(两者都是到节点的受管指针)。这些图表经常有周期。
我的问题是:在这种图形数据结构中管理内存的最佳方法是什么,特别是在转换和变换图形时?由于存在周期,它们不适合引用计数(即使你试图使用弱指针,通常也不清楚周期在哪里,因此在哪里放置弱链接。)
在我的各种实现中,我经常跟踪所有分配的节点和边缘,与图形分开,以及图形的入口点列表。然后我实现了一个简单的垃圾收集器。在定期间,应用了各种图形转换(包括取消链接某些节点/边缘),我运行gc,其中涉及:
这很好用(并且是标记/扫描的简单实现)。但它总是看起来有点笨拙。有没有人对这个问题或更好的替代解决方案有任何见解?
答案 0 :(得分:0)
当您有有限图时,不要将它们表示为指针结构。相反,使用
vector
,list
,等等)和顶点列表,或map
或unordered_map
)和布尔值的矩阵(2-d数组)(或加权图的浮点数),表示是否是顶点i
和j
已关联。前一种表示称为adjacency list,后者称为adjacency matrix。使用哪一个取决于您拥有的图表以及您要执行的操作。两者在内存管理方面都要简单得多,并且通常比指针结构更高效,因为它们占用的内存更少,并且往往保留了引用的局部性。