是否有一种算法(最好是常数时间)可以检查集合A是否是集合B的子集?
创建数据结构以便解决此问题不会影响运行时间。
是否有一种算法(最好是常数时间)可以检查集合A是否是集合B的子集?
创建数据结构以便解决此问题不会影响运行时间。
嗯,你需要查看A
的每个元素,因此它至少需要与A
的大小成线性时间。
使用哈希表(将B
的元素存储在哈希表中,然后查找A
的每个元素),可以轻松实现O(A+B)
算法。除非你知道一些关于B
的高级结构,否则我认为你无法做得更好。例如,如果B
按排序顺序存储,则可以使用二分查找进行O(A log B)
。
你可以尝试布隆过滤器(http://en.wikipedia.org/wiki/Bloom_filter)。但是可能会出现误判,可以通过Keith上面提到的方法来解决(但请注意,哈希的最坏情况复杂度不是O(n),而是可以做到O(nlogn))。