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