问题
给定 N 个包含 C 个布尔值的数组。我想把它们组织成一种数据结构,使得可以尽可能快地执行以下操作:给定一个新的数组,如果这个数组是任何存储的数组的“超集”,则返回 true。在此处,“超集”指:如果 B[i] 为真,则 A[i] 对于每个 i 都为真。如果 B[i] 为假,则 A[i] 可以是任意值。
或者,用集合而不是数组表示:
将 N 个集合(每个集合都有 C 个可能元素)存储到一种数据结构中,以便您可以快速查找给定集合是否是任何存储的集合的超集。
构建数据结构可以花费尽可能长的时间,但是查找应该尽可能高效,并且数据结构不能占用太多空间。
一些背景信息
我认为这本身就是一个有趣的问题,但是对于我真正要解决的问题,您可以假设以下内容:
- N = 10000
- C = 1000
- 存储的数组是稀疏的
- 被查询的数组是随机的(因此不稀疏)
我已经想到的方法
对于 O(NC) 的查找:只需遍历所有数组。但是这太慢了。
对于 O(C) 的查找:我在这里写了一个很长的描述,但是正如 Amit 在评论中指出的那样,它基本上是一个BDD。虽然具有快速查找速度,但节点数呈指数级增长。由于 N 和 C 很大,这占用了太多空间。
希望在 O(N*C) 和 O(C) 解决方案之间,可能有一种不需要指数数量空间的 O(log(N)*C) 解决方案。
编辑:我想到的新点子
对于O(sqrt(N)C)的查找:将数组存储为前缀树。当查找一个数组A时,如果A[i]=0,就进入合适的子树,但如果A[i]=1,则访问两个子树。
我的直觉告诉我,如果假设存储的数组是随机的,这应该使得查找(平均)复杂度为O(sqrt(N)C)。但是:1.它们不是随机的,数组是稀疏的。2.这只是直觉,我无法证明。
我将尝试使用这个新方法和BDD方法,看看哪一种最好。
但同时,这个问题是否更常见?它有没有名称?之前是否有相关研究?感觉自己在重新发明轮子。