找到一个集团并获得该集团的所有成员有什么好的算法? 例如,我有:
a-b-c-d
e-f-g
h-i
x-y-x
其中每一行代表一个所有成员互相认识的集团。
现在给定一个节点(比如a
)我想快速找到clique a-b-c-d
并获取成员列表[a, b, c, d]
我总是可以有一个节点列表到节点列表,并让每个成员指向其余成员的列表:
a -> [b, c, d]
b -> [a, c, d]
c -> [a, b, d]
...
但我要复制大量数据。
编辑:更新不频繁,应该假定为静态。成员只属于一个集团
答案 0 :(得分:2)
一种选择是拥有一个混合哈希表/链表。将每个集团存储为所有集团元素的循环,双重链接列表。然后,让哈希表将每个元素映射到表示它的链表单元格。要列出包含某个元素的clique的所有元素,请查找该元素的单元格,然后按循环列表列出该clique的其余元素。
此数据结构还支持在时间O(1)中组合两个派系(通过哈希表查找派系的任何两个元素并将循环列表拼接在一起)并在时间O中添加或删除派系中的元素( 1)通过将它们拼接到圆形列表中或从圆形列表中拼接出来。您可以在O(k)时间列出clique成员资格,其中k是集团中元素的数量,整个事物使用O(n)空间。
希望这有帮助!