6

给定一个包含重复元素的集合** S,如何确定 S 的所有可能子集的总数,其中每个子集都是唯一的。

例如,假设 S = {A, B, B} 并设 K 为所有子集的集合,则 K = {{}, {A}, {B}, {A, B}, {B, B}, {A, B, B}} 因此 |K| = 6。

另一个例子是如果 S = {A, A, B, B},那么 K = {{}, {A}, {B}, {A, B}, {A, A}, {B, B}, {A, B, B}, {A, A, B}, {A, A, B, B}} 和因此 |K| = 9

很容易看出,如果 S 是一个只有唯一元素的实集,那么 |K| = 2^|S|。

计算这个值的公式是什么|K| 给定一个“集合”S(有重复项),而不生成所有子集?

** 从技术上讲不是一套。

4

2 回答 2

16

取所有(频率 + 1)的乘积。

例如,在 {A,B,B} 中,答案是 (1+1) [As 的数量] * (2+1) [Bs 的数量] = 6。

在第二个示例中,count(A) = 2 和 count(B) = 2。因此答案是 (2+1) * (2+1) = 9。

这样做的原因是您可以将任何子集定义为计数向量 - 对于 {A,B,B},子集可以描述为 {A=0,B=0}, {A=0,B=1 }、{0,2}、{1,0}、{1,1}、{1,2}。

对于 counts[] 中的每个数字,都有(该对象的频率 + 1)可能的值。(0..频率)

因此,可能性的总数是所有(频率+1)的乘积。

“所有唯一”的情况也可以这样解释——每个对象出现一次,所以答案是 (1+1)^|S| = 2^|S|。

于 2009-04-10T02:39:08.533 回答
4

我会争辩说,如果以正确的方式来看,这个问题很容易解决。你不关心元素的顺序,只关心它们是否出现在一个子集中。

计算每个元素在集合中出现的次数。对于一个元素集{A},有多少个子集?显然只有两套。现在假设我们添加了另一个不同于 A 的元素 B,以形成集合 {A,B}。我们可以很容易地形成所有集合的列表。取出我们仅使用 A 形成的所有集合,并添加零个或一个 B 副本。实际上,我们将集合的数量加倍。显然,我们可以使用归纳法来证明对于 N 个不同的元素,集合的总数仅为 2^N。

假设某些元素出现多次?考虑具有三个 A 副本的集合。因此 {A,A,A}。你能形成多少个子集?同样,这很简单。我们可以有 A 的 0、1、2 或 3 个副本,因此子集的总数为 4,因为顺序无关紧要。

一般来说,对于元素 A 的 N 个副本,我们最终会得到 N+1 个可能的子集。现在,通过添加一些数量 M 的 B 副本来扩展它。所以我们有 A 的 N 个副本和 B 的 M 个副本。总共有多少个子集?是的,这似乎也很清楚。对于其中只有 A 的每个可能子集(其中有 N+1 个),我们可以添加 B 的 0 到 M 个副本。

因此,当我们有 N 个 A 副本和 M 个 B 副本时,子集的总数很简单。它必须是 (N+1)*(M+1)。同样,我们可以使用归纳论证来证明子集的总数是这些项的乘积。只需计算每个不同元素的重复总数,加 1,然后取乘积。

看看集合 {A,B,B} 会发生什么。我们得到 2*3 = 6。

对于集合 {A,A,B,B},我们得到 3*3 = 9。

于 2009-04-10T12:18:28.280 回答