Data structures 用于查找包含元素的集合的数据结构

Data structures 用于查找包含元素的集合的数据结构,data-structures,language-agnostic,Data Structures,Language Agnostic,当N个项目被分组到M个不同的集合中时,什么是一个好的数据结构来查找元素属于哪个集合?例如,如果集合是{A,B},{C,D,E},{F,G},我如何找到给定“D”的集合?。这些集合是散列集合,因此集合中的contains查询是O(1) 如果我在集合列表中有集合 [{A,B}, {C,D,E}, {F,G}] 我可以通过询问列表中的每个集合是否包含该项来进行查找。这很容易实现,运行时间是线性的(以集合的数量为单位) 一种更快的方法是将所有集合存储在一个哈希表中,对每个集合中的每个项目进行键控。即:

当N个项目被分组到M个不同的集合中时,什么是一个好的数据结构来查找元素属于哪个集合?例如,如果集合是{A,B},{C,D,E},{F,G},我如何找到给定“D”的集合?。这些集合是散列集合,因此集合中的contains查询是O(1)

如果我在集合列表中有集合

[{A,B}, {C,D,E}, {F,G}]
我可以通过询问列表中的每个集合是否包含该项来进行查找。这很容易实现,运行时间是线性的(以集合的数量为单位)

一种更快的方法是将所有集合存储在一个哈希表中,对每个集合中的每个项目进行键控。即:

[A -> {A, B},
 B -> {A, B},
 C -> {C, D, E},
 D -> {C, D, E},
 E -> {C, D, E}, 
 F -> {F, G}, 
 G -> {F, G}]

这种结构让我能够在O(1)时间内检索到正确的集合,但它感觉效率低下且丑陋。是否有更好的数据结构允许对正确的集合进行O(1)查找?我应该像布卢姆过滤器一样,通过组合散列来生成查找键吗?其他想法?

您可以通过以下方式实施:

你需要一组树。索引将是设置的编号

有一个哈希表来存储整个列表中每个元素的(元素、索引)对


对于每个集合,您都可以使用树状结构,唯一标识符是根,列表的元素连接到根。

“感觉效率低下?”您尝试过吗?@larsmans在运行时设置“效率低下”:必须创建和插入N个dict项并复制值,而且存储效率低下,因为对于值类型集合,内存中集合中的每个项都有许多副本。这需要线性时间。如果使用引用/指针而不是值,则不需要复制任何内容,这在大多数语言中都很容易。是的,唯一的开销可能是复制指针,但有大量的小集合,这是非常重要的。集合引用可以与集合内容大小相比较,例如,如果集合很小,项目是整数,指针是64位。我们谈论的是多少集合?几十亿?一百万个指针