【发布时间】:2012-09-24 06:30:14
【问题描述】:
在作为特定集合子集的有限集合中找到集合的最佳算法是什么?
例如,如果
A = {1, 2}
B = {2, 3, 4}
C = {3, 5}
D = {6}
和 X = {1, 2, 3, 5}
那么,A 和 C 是 X 的子集。
有没有一种算法可以在线性时间复杂度上做到这一点?
实现说明:集合的成员通常来自非常有限的范围,因此,使用 C++ bitset 来实现算法可能是一个好主意。不能吗?
编辑:集合中的集合数通常非常大于 X 中的元素数(在示例中)。有没有办法根据 X 中的元素数量来做到这一点?可能使用哈希什么的?
【问题讨论】:
-
没有办法在真正的线性时间内做到这一点。测试一个集合是否包含另一个集合在技术上始终是二次时间,但是在实践中使用哈希表将使此类问题成为线性时间(如果集合具有合理的长度)。所以你的问题的答案是时间复杂度将是
M*N*Q,如果 M 是集合的数量 (A-D),N 是这些集合中最大的集合的大小,Q 是集合 X 的大小。 -
你能给我一个链接或者可能是算法的名称吗?
-
重要的不是算法,而是数据结构。正如您(和@amit)所提到的,如果您的可能元素数量有限,那么位集很有用。 hash table 是另一个非常有用的数据结构(在 C++ 中它被称为 unordered_map。