给定一组正整数 <=k 及其 n 个子集,找到哪些子集对给出原始集合的并集
Given a set of positive integers <=k and its n subsets , find union of which pairs of subsets give the original set
i有一个由第一个p阳性整数组成(1至p(组成的集合,并且我得到了该集合的n个子集。我如何找到联合上有多少对子集将给原始集合一个?
当然,可以通过检查每对的结合大小来天真地完成,如果等于P,则联合必须组成a,但是有一种更优雅的方法,这会减少时间复杂性?
C 中的set_union具有2*(size(set 1) + size(set 2)) - 1
的时间复杂性,这对NC2 Pairs不利。
如果我们需要应对最坏的情况,那么对此问题的一些想法:
-
我想,由于联合操作的速度要快得多,因此在没有任何优化的情况下使用
std::bitset
就足够了。但是,如果没有,请勿使用变量大小向量,请使用简单的P-Length 0-1数组/向量或Unordered_sets。我认为没有o(1(发现操作的可变大小向量不会在最坏情况下会更好。 -
使用启发式方法最大程度地减少子集工会。最简单的启发式方法是检查子集的大小。我们只需要那些对
size(A) + size(B) >= p
的子集的(A, B)
。 -
除了启发式方法外,我们还可以(在
O(n^2)
中(计算每个数字中每个数字的频率。之后,我们可以按频率增长顺序检查一些子集中的数字的存在。另外,我们可以排除每个子集中出现的数字。 -
如果您要修复一些子集
A
(例如,在外循环中(,并且会找到与其他子集的工会,则只能检查那些在集合A
中出现的数字。如果子集A
足够大,则可以大大减少所需的操作数量。
只是对您的方法的可能改进,而不是二进制搜索,您可以保留一个布尔数组,以找出是否某些 x 出现在数组 i in o(1(。
例如,假设输入时,您可以将所有外观保存为数组 i 。含义,如果 X 出现在数组 i 中,则 iSthere [i] [x] 应该是正确的。
这可以节省一些时间。
- 处理多个异常集合的C++方法
- 给定n个元素的m个集合.在C++中找到出现在最大集合数中的元素
- 如何将ampl中的集合表示为c++中的向量
- 显示字符串的集合和子集
- 在尝试使用递归查找集合子集的总数时,我遇到了分割错误
- 打印给定大小的集合的所有子集并计算子集
- 给定一组正整数 <=k 及其 n 个子集,找到哪些子集对给出原始集合的并集
- (也许是NP-Hard)求一个集合的子集总数,使得每个子集在与其所有元素相乘时的值都大于X
- 如何生成集合的所有唯一子集
- 动态规划:计算集合中存在多少个升序子集
- 递归函数,用于使用位掩码 c++ 显示集合的所有子集
- 拘泥于处理(数学)集合和子集的练习
- 生成给定集合的子集(使用递归)的程序的执行涉及哪些步骤
- 用于访问集合c++的排序子集的数据结构
- 一个多索引,其中一个索引是整个集合的子集
- 从一组集合中找到集合子集的最佳方法
- 使用0来显示不存在元素的集合的子集
- 从一个集合生成所有可能的有序子集
- 如何将一个集合分成K个子集,使得子集中元素的和最小
- 生成一个集合的所有子集,使它们的集合等于整个集合