是否有算法(最好是恒定时间)来检查集合A是否是集合B的子集?
创建数据结构以解决此问题不计入运行时。
答案 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)。
答案 2 :(得分:0)
如果你的字符串集中有最不常见的字母和字母对的列表,你可以存储用最不常见的字母和字母对排序的集合,并最大限度地提高你尽可能快地抛出负面匹配的机会。 我不清楚它与布隆过滤器的结合程度如何,哈希表可能会做得很好,因为没有很多的数字和字母。
如果您有关于子集的最大大小或甚至常见大小的信息,您可以通过将给定大小的所有子集放入如上所述的布隆过滤器中来类似地预处理数据。
你也可以将这两者结合起来。