在c ++中我正在寻找一种有效的算法来生成所有整数,使得它们的二进制表示是一个集合的子集,由整数N的二进制表示给出。有效的我意味着我不想要-loop通过小于N的所有整数来检查它们是否是子集,主要是因为N可能非常大。
我的想法是生成对应于汉明重量N的整数的所有可能子集,然后使用<<来将它们移动到正确的位置,但我到目前为止未能找到一个好方法如何这样做。
示例:
对于由整数N = 52给出的集合110100,所有可能的子集将是:
{000100,010000,010100,100000,100100,110000}
对应于整数{4,16,20,32,36,48},这是我想要生成的。
答案 0 :(得分:0)
设P为popcount(N),即设置的位数。结果的数量是2 P - 2.
将N视为布尔数组(位)。对于设置的每个位,生成两个子集:一个具有该位集,另一个不具有该位。这可以递归完成,直到没有设置位为止。
最后,从结果中丢弃原始N,并且0(根据您的示例)。
时间复杂度在输出大小上是线性的,即O(2 P )。