【问题标题】:How is it possible to iterate over all subsets of a set represented by bits? [closed]如何迭代由位表示的集合的所有子集? [关闭]
【发布时间】:2018-10-16 08:12:24
【问题描述】:

我正在查看this article,它解释了

也可以迭代特定子集的所有子集(由位模式表示),前提是您不介意以相反的顺序访问它们(如果这有问题,请将它们放在一个列表中,因为它们' 生成,然后向后走列表)。该技巧类似于查找数字中的最低位的技巧。如果我们从一个子集中减去 1,那么最低的集合元素被清除,并且每个较低的元素都被设置。但是,我们只想设置超集中的那些较低的元素。所以迭代步骤就是 i = (i - 1) & superset。

尽管重读了几遍,我还是无法理解。有人可以举个例子解释一下吗?

【问题讨论】:

    标签: bit-manipulation bit


    【解决方案1】:

    如果我们有一些表示为位掩码的集合,例如如果我们有宇宙:

    U = { A, B, C, D, E, F, G }
    

    那么辅音S = { B, C, D, F, G }可以表示为0b1101110(从右边读取,最低有效位对应于A),我们可以遍历这个集合的子集:

    i = (i - 1) & S
    

    因为减 1 将借用任何尾随零并取消设置最低设置位,所以& S 会清除以这种方式设置但不在S 中的所有位。例如:

    i0 = 0b1101110 (the whole S)
    i1 = i0 - 1 & S = 0b1101110 - 1 & S = 0b1101101 & S = 0b1101100
    

    所以下一个子集是{ C, D, F, G },现在删除 B。那么接下来就是

    i1 = 0b1101100
    i2 = i1 - 1 & S = 0b1101100 - 1 & S = 0b1101011 & S = 0b1101010
    

    代表{ B, D, F, G }

    顺便说一句,它可以在不将整个内容存储在列表中的情况下向前完成:

    i = ((i | ~S) + 1) & S
    

    这里我们需要一个额外的| ~S 来设置“中间”位以使+ 1 通过它们,否则它是相同的想法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-31
      • 2014-04-12
      • 1970-01-01
      • 1970-01-01
      • 2021-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多