我需要存储图分区的数据分组节点,例如:
[node1,node2] [node3] [node4,node5,node6]
我的第一个想法是只有一个简单的向量或整数数组,其中数组中的位置表示为node_id,它的值是某种group_id
问题是许多分区算法依赖于对组内的节点对进行操作。使用这种方法,我想我会浪费大量的计算搜索来找出哪些节点属于同一组。
我还可以存储为一组stl,这看起来更接近分区的数学定义,但我得到的印象是嵌套集不建议或不必要,我需要修改内部集我我不确定是否可能。
有什么建议吗?
答案 0 :(得分:3)
根据您对集合的确切要求,您可以尝试disjoint set data structure。在此结构中,每个元素都有一个方法find
,它返回它所属的集合的“代表”。
Boost中提供了C ++实现。
答案 1 :(得分:2)
有两种好的数据结构可供想到。
第一个数据结构(以及之前提到的那个)是不相交集林,它提供了“合并这两个集合”和“什么集合是x?”的非常有效的实现。但是,它不支持将组分开的操作。
我推荐的其他结构是链接/剪切树。此结构允许您构建可以连接到树中的图形分区。与不相交的集合林不同,描述分区的树可以被切割成更小的树,允许您将分区分成更小的组。这个结构的效率比union / find结构稍微低一点,但它仍然支持分摊的O(lg n)中的所有操作。