2014-12-05 54 views
1

寻找派系并获得派系所有成员的好方法是什么? 例如我有:快速派系查询的数据结构

a-b-c-d 
e-f-g 
h-i 
x-y-x 

,其中每行代表一个集团,其中所有成员都知道彼此。 现在给出一个节点(比如a)我想快速找到集团a-b-c-d并获得会员的名单有[a, b, c, d]

我可以随时节点到节点列表的字典,让每个成员点的列表其余成员:

a -> [b, c, d] 
b -> [a, c, d] 
c -> [a, b, d] 
... 

但我会复制大量的数据。

编辑:更新不频繁,应该被认为是静态的。成员只属于一个团体

+0

什么样的更新是可能的?你需要支持动态插入或删除吗?所有元素都属于一个集团吗? – templatetypedef 2014-12-05 03:01:31

+0

在你的例子中'g'属于两个派系。请澄清。 – tmyklebu 2014-12-05 03:11:03

+0

哎呀对不起的错字:( – WindowsMaker 2014-12-05 03:17:02

回答

2

一个选项是有一个混合散列表/链接列表。将每个派系存储为所有派系元素的循环链接列表。然后,有一个散列表将每个元素映射到表示它的链表列单元格。要列出包含某个元素的集团的所有元素,请查找该元素的单元格,然后按照循环列表列出集团的其余元素。

该数据结构还支持在时间O(1)中组合两个派系(通过哈希表查找派系中的任意两个元素并将圆形列表拼接在一起)以及在时间O中添加或移除派生元素(1)将它们拼接成圆形列表或将其拼出。您可以在O(k)时间中列出集团成员,其中k是集团中元素的数量,整个事物使用O(n)空间。

希望这会有所帮助!

+0

不应该是空间复杂度为O(nk)其中k是每个链接列表中元素的数量? – WindowsMaker 2014-12-05 03:24:23

+0

每个元素都属于到只有一个链接列表,所以如果你总结链表的总数,你只能有n个。总的来说,这只给出了O(n)的空间使用量。 – templatetypedef 2014-12-05 03:26:59