【发布时间】:2013-10-18 10:28:48
【问题描述】:
我有这段代码可以生成大小为 4 的数组的幂集(数字只是示例,要编写的组合更少...)。
#define ARRAY_SIZE 4
unsigned int i, j, bits, i_max = 1U << ARRAY_SIZE;
int array[ARRAY_SIZE];
for (i = 0; i < i_max ; ++i) {
for (bits = i, j = 0; bits; bits >>= 1, ++j) {
if (bits & 1)
printf("%d", array[j]);
}
}
输出:
{}
{1}
{2}
{1, 2}
{3}
{1, 3}
{2, 3}
{1, 2, 3}
{4}
{1, 4}
{2, 4}
{1, 2, 4}
{3, 4}
{1, 3, 4}
{2, 3, 4}
{1, 2, 3, 4}
我需要这样的输出:
{1}
{2}
{3}
{4}
{1, 2}
{1, 3}
{1, 4}
{2, 3}
{2, 4}
{3, 4}
{1, 2, 3}
{1, 2, 4}
{1, 3, 4}
{2, 3, 4}
{1, 2, 3, 4}
所以必须这样订购。我不能在算法结束后进行排序,我必须在每次迭代中使用每个组合,所以它必须生成已经排序的组合。有人可以帮我吗?我想我正在考虑一切......
编辑:最终输出应该没有空集,但这不是优先级。
【问题讨论】:
-
您的意思是在第二种情况下省略空集吗?从数学上讲,它是幂集的完全有效成员。
-
我是认真的,只是忘了提,抱歉。谢谢。
-
实际上,你想要的并不是按字典顺序排列的。它按大小排序,然后按字典顺序排列在大小相等的组中(字典中香蕉排在猫之前)。
-
再次感谢!已编辑;)
-
这样一个存在的问题当然必须用 42 行代码来回答(见我的回答);-)
标签: c++ algorithm subset powerset bit-manipulation