【问题标题】:Contains superset包含超集
【发布时间】:2014-12-23 19:46:19
【问题描述】:

我正在寻找一种结构(“集合集”),它可以让我有效地检查它是否包含我的集合的超集。

示例: A = { 1, 2 } B = { 2, 3 } C = { 1, 3 } D = { 1, 2, 3 }

集合 S1 = { A, B } 和另一个 S2 = { D }

S1 contains A => true
S1 contains C => false
S2 contains A => true

解决方案的复杂度应尽可能低(不仅是渐近的)。

【问题讨论】:

  • 你的套装有多大?你有几个?
  • 集合通常包含少于 5-10 个字符串(或长字符串),并且集合最多应包含 ~100-1000 个集合,但在大多数情况下为 10-100 个集合。
  • 集合本身或集合的集合可以改变(即可以插入/删除)还是它们都是静态的?
  • 集合是不可变的,但集合的集合不是,基本上用作重复过滤器。
  • @Jiri 由于内部集既小又不可变,您是否考虑过仅枚举所有子集并将它们存储在哈希表中?空间为 O(n * 2^m),其中 n 是集合的数量,m 是每个集合的元素数量。插入/删除将是 O(2^m) 并且查询 O(1)

标签: algorithm set


【解决方案1】:

使用字典在位图中可能的不同元素和位置之间进行转换。然后将每个集合存储为位图。

取一组集合的并集是一个将位图组合在一起的问题。

检查一个集合是否是一组集合的子集是检查位图的与结果是否为较小集合的位图。

这些操作应该很快。如果你真的有野心,你可以从 http://en.wikipedia.org/wiki/General-purpose_computing_on_graphics_processing_units 开始,然后弄清楚如何将计算转移到 GPU。

如果您有较大的集合并且有时会得到错误的答案是可以接受的,那么您应该查找 Bloom Filters。这可以让您以明显更短的位图获得大部分正确的答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-26
    • 2012-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多