关于使用数组和位向量的集合

时间:2014-10-14 14:21:07

标签: c math data-structures set

我正在阅读以下位置的数组和位向量集。

http://www.brpreiss.com/books/opus4/html/page390.html

  

在本节中,我们考虑有限宇宙上的有限集。   具体来说,我们考虑的宇宙是{0,1,...,N-1},这是一组   对于一些固定的和相对的,整数在0到N-1的范围内   小的N.

     

设U = 0,1,...,N-1}为宇宙。我们希望的每一套   代表是U的子集.U的所有子集的集合称为   U的幂集合被写为2 ^ U(即2的U的幂)。从而,   我们希望代表的集合是2 ^ U的元素   集合U中的元素数量,写入| U |,是N.类似地,| 2 ^ U | =   2 ^ | U | = 2 ^ N。这种观察应该是显而易见的:对于每一个元素   通用集合U只有两种可能性:它是,或者   它不是,给定集合的成员。

     

这表明了相对简单的表现形式   2 ^ U的元素 - 布尔值数组,每个元素对应一个   通用集。通过在U中使用数组下标,我们可以表示   隐含地设置。即,如果是第i个数组,我是该集合的成员   元素是真的。

我对上述文字的疑问是

  1. 作者的意思是什么?#34; U的所有子集的集合被称为U的幂集并被写为2 ^ U(即2的U的幂)?例如,如果我们有U = {0,1,2},那么我们有2 ^ 3 = 8是所有子集的集合但我们有超过8例如{empty set},{0},{1}, {2},{0,1},{0,2},{0,3},{1,2}和{1,2,3}为9.如果我错了,请纠正我?

  2. 作者和为何如何提出2的力量而不是像3等其他任何数字?

  3. 请澄清。

2 个答案:

答案 0 :(得分:3)

@haccks给出的第一个问题的答案是正确的,但我认为理解第二个问题实际上更重要,因为它确实显示了一个阵列到底是什么。

您将集{0,1,2}表示为位数组,如下所示:

2 1 0  <-- set members
0 0 0  <-- bit array value (present/not present)

(由于一会儿就会明白的原因,我已经向后订购了这套装置。)
位数组[0,0,0]表示空集。没有任何集合成员存在。子集{1,2}表示为:

2 1 0  <-- set members
1 1 0  <-- bit array value

每个成员都可以存在或不存在;零或一。每个成员有两种可能性,这意味着我们拥有一个包含3个元素的集合的2*2*2=2^3个子集。因此,这是作者提出2而不是其他数字的地方。

您现在应该能够看到位数组只不过是带有|U|位的二进制数。实际上,生成幂集的一种方法是从0(2^|U|)-1计算二进制数:

0  000  {}
1  001  {0}
2  010  {1}
3  011  {0,1}
4  100  {2}
5  101  {0,2}
6  110  {1,2}
7  111  {0,1,2}

现在还应该显而易见的是,我已经向后排序了集合,以便第一个元素与对应于位数组的二进制数的LSB对齐。您可以通过其他方式对其进行排序,但bit 0对应U[0]似乎更合乎逻辑。

答案 1 :(得分:1)

U= {0,1,2}的权力集将包含

{empty set}
{0}
{1}
{2}
{0,1}
{0,2}
{1,2}
{0,1,2}   

等于2 | U |

我想知道你是怎么来到子集{0,3}{1,2,3}的?