用于检查集合A是否在比线性时间更快的集合B的子集的算法

时间:2012-10-05 23:43:47

标签: algorithm set subset

是否有算法(最好是恒定时间)来检查集合A是否是集合B的子集?

创建数据结构以解决此问题不计入运行时。

3 个答案:

答案 0 :(得分:1)

好吧,你将不得不查看A的每个元素,因此它必须至少是A大小的线性时间。

O(A+B)算法很容易使用哈希表(在哈希表中存储B的元素,然后查找A的每个元素)。除非你知道B的一些先进结构,否则我认为你不能做得更好。例如,如果B按排序顺序存储,则可以使用二分搜索执行O(A log B)

答案 1 :(得分:0)

你可以选择布隆过滤器(http://en.wikipedia.org/wiki/Bloom_filter)。然而,可能存在误报,可以通过Keith上面提到的方法解决(但请注意,哈希的最坏情况复杂性不是O(n),但是你可以做O(nlogn)。

  1. 根据Bloom过滤器
  2. 查看A是否是B的子集
  3. 如果是,请进行彻底检查

答案 2 :(得分:0)

如果你的字符串集中有最不常见的字母和字母对的列表,你可以存储用最不常见的字母和字母对排序的集合,并最大限度地提高你尽可能快地抛出负面匹配的机会。 我不清楚它与布隆过滤器的结合程度如何,哈希表可能会做得很好,因为没有很多的数字和字母。

如果您有关于子集的最大大小或甚至常见大小的信息,您可以通过将给定大小的所有子集放入如上所述的布隆过滤器中来类似地预处理数据。

你也可以将这两者结合起来。