【问题标题】:About sets using arrays and bit vectors关于使用数组和位向量的集合
【发布时间】:2014-10-14 14:21:07
【问题描述】:

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

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

在本节中,我们考虑有限宇宙上的有限集。 具体来说,我们考虑的宇宙是 {0,1,...,N-1},即 整数在从零到 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. 作者所说的“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 等任何其他数字?

请澄清。

【问题讨论】:

    标签: c math data-structures set


    【解决方案1】:

    @hacks 对第一个问题的回答是正确的,但我认为理解第二个问题实际上更重要,因为它准确地显示了位数组的真正含义。

    您将您的集合 {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
    

    每个集合成员可以存在或不存在;零或一。每个成员有两种可能性,这意味着我们有 2*2*2=2^3 具有 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] 似乎更合乎逻辑。

    【讨论】:

      【解决方案2】:

      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} 的子集的?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-09
        • 2012-10-07
        • 1970-01-01
        • 1970-01-01
        • 2018-03-02
        • 2018-08-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多