生成c ++中整数二进制表示给出的所有集合子集

时间:2018-05-10 10:31:44

标签: algorithm binary subset gray-code

在c ++中我正在寻找一种有效的算法来生成所有整数,使得它们的二进制表示是一个集合的子集,由整数N的二进制表示给出。有效的我意味着我不想要-loop通过小于N的所有整数来检查它们是否是子集,主要是因为N可能非常大。

我的想法是生成对应于汉明重量N的整数的所有可能子集,然后使用<<来将它们移动到正确的位置,但我到目前为止未能找到一个好方法如何这样做。

示例:

对于由整数N = 52给出的集合110100,所有可能的子集将是:

{000100,010000,010100,100000,100100,110000}

对应于整数{4,16,20,32,36,48},这是我想要生成的。

1 个答案:

答案 0 :(得分:0)

设P为popcount(N),即设置的位数。结果的数量是2 P - 2.

将N视为布尔数组(位)。对于设置的每个位,生成两个子集:一个具有该位集,另一个不具有该位。这可以递归完成,直到没有设置位为止。

最后,从结果中丢弃原始N,并且0(根据您的示例)。

时间复杂度在输出大小上是线性的,即O(2 P )。