给定一组正整数 <=k 及其 n 个子集,找到哪些子集对给出原始集合的并集

Given a set of positive integers <=k and its n subsets , find union of which pairs of subsets give the original set

本文关键字:子集 集合 原始 及其 一组 整数 lt      更新时间:2023-10-16

i有一个由第一个p阳性整数组成(1至p(组成的集合,并且我得到了该集合的n个子集。我如何找到联合上有多少对子集将给原始集合一个?

当然,可以通过检查每对的结合大小来天真地完成,如果等于P,则联合必须组成a,但是有一种更优雅的方法,这会减少时间复杂性?

C 中的set_union具有2*(size(set 1) + size(set 2)) - 1的时间复杂性,这对NC2 Pairs不利。

如果我们需要应对最坏的情况,那么对此问题的一些想法:

  1. 我想,由于联合操作的速度要快得多,因此在没有任何优化的情况下使用std::bitset就足够了。但是,如果没有,请勿使用变量大小向量,请使用简单的P-Length 0-1数组/向量或Unordered_sets。我认为没有o(1(发现操作的可变大小向量不会在最坏情况下会更好。

  2. 使用启发式方法最大程度地减少子集工会。最简单的启发式方法是检查子集的大小。我们只需要那些对 size(A) + size(B) >= p的子集的(A, B)

  3. 除了启发式方法外,我们还可以(在O(n^2)中(计算每个数字中每个数字的频率。之后,我们可以按频率增长顺序检查一些子集中的数字的存在。另外,我们可以排除每个子集中出现的数字。

  4. 如果您要修复一些子集A(例如,在外循环中(,并且会找到与其他子集的工会,则只能检查那些在集合A中出现的数字。如果子集A足够大,则可以大大减少所需的操作数量。

只是对您的方法的可能改进,而不是二进制搜索,您可以保留一个布尔数组,以找出是否某些 x 出现在数组 i in o(1(

例如,假设输入时,您可以将所有外观保存为数组 i 。含义,如果 X 出现在数组 i 中,则 iSthere [i] [x] 应该是正确的。

这可以节省一些时间。