【发布时间】: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