【问题标题】:Data structure for finding set containing element查找包含元素的集合的数据结构
【发布时间】:2013-04-25 18:44:42
【问题描述】:

什么是查找元素属于哪个集合的良好数据结构,将 N 个项目分组到 M 个不同的集合中?例如,如果集合是 {A,B} , {C,D,E}, {F,G} 我怎样才能找到给定“D”的集合?这些集合是哈希集合,因此集合内的包含查询是 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 位。
  • 我们在谈论多少套?数十亿?一百万个指针占用

标签: data-structures language-agnostic


【解决方案1】:

你可以这样实现:

您将需要一组树。 index 将是设置的数字。

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

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

【讨论】:

    猜你喜欢
    • 2020-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-26
    • 2012-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多