【问题标题】:Bit masks for subsets from two different sets来自两个不同集合的子集的位掩码
【发布时间】:2017-08-15 17:25:31
【问题描述】:

我有两套-

set1 - {i1,i2,i3...iN1}

set2 - {k1,k2,k3...kN2}

对于任何 n 个项目的集合,我可以使用位掩码 0-2^n -1 表示所有可能的子集。 同样,我该如何表示 -

set1 和 set2 的所有可能子集,其中至少 1 个项目来自不同的集合。

例如
{i1,i2,k1} 有效

但是 {i1,i2} - 无效,因为它没有来自 set2 的项目。

我正在尝试生成两件事 -

  1. 一种可以给我计算所有子集的等式,就像我们有 2^n 个子集用于单个 n 项集。

  2. 位编码/掩码,我可以使用它来表示上述类型的子集。

【问题讨论】:

  • 集合是否不相交?
  • 不,它们可以有共同的数字。
  • @GD 要清楚这个问题,所以如果一组 A 有 = {1,2,3} 并且 B 有 = {2} 并且我的最后一组有来自 A 的 1 和来自 B 的 3 并且所以最终的集合看起来像 - {1,3},根据提供的约束,这会被认为是一个有效的子集吗?
  • @zenwraight 是的,它只是至少 1 项应该存在于第二组中,否则它不再是两组的子集。
  • @G.D 是的,它们是不相交的集合,然后它变得非常容易,因为它归结为一个简单的组合问题......

标签: algorithm bit-manipulation


【解决方案1】:

如果我们引入一些额外的兴趣组,这将更容易。我们称这两个输入集为 S1 和 S2;我们将定义集合 L、C 和 R(用于左、中和右)。将这些视为维恩图。因此,定义 L = S1 \ S2,即 S1 中根本不在 S2 中的元素; C = S1 ∩ S2,同时在 S1 和 S2 中的元素,并且 R = S2 \ S1。我们也分别为这些集合的大小写 l、c 和 r。

现在我们准备回答问题 1:有多少 S1 ∪ S2 的子集有一个来自 S1 的元素并且有一个来自 S2 的元素?有两种情况需要考虑:或者我们有一个包含 C 中的元素的子集(它同时满足“来自 S1 的元素”和“来自 S2 的元素”子句),或者我们在 C 中没有元素并且至少有一个每个来自 L 和 R。在第一种情况下,C 有 (2^c - 1) 个非空子集,其余部分有 2^(l+r) 个子集,因此有 (2^c - 1) *2^(l+r) 在这种情况下设置。第二种情况,L有2^l - 1个非空子集,R有2^r - 1个非空子集,所以有(2^l - 1) * (2^r - 1)个子集在这种情况下。将这两种情况相加,我们总共有 2^(c+l+r) - 2^l - 2^r 个满足条件的子集。

如果您对非空子集有一个花哨的表示,这也立即建议了一种用于存储这些的数据结构:您所处的情况下的单个位标记,加上子集和非空子集的适当表示每个案例。

但我可能只使用一个大小为 c+l+r 的位掩码,即使有一些“无效”位掩码:它非常紧凑,很容易检查有效性,并且位掩码上有许多廉价的操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-06
    • 2021-08-31
    • 2011-06-02
    • 1970-01-01
    • 2018-06-27
    • 2015-01-27
    相关资源
    最近更新 更多