打印列表的所有可能子集

Ste*_*eve 9 java algorithm powerset superset

我有一个元素列表(1,2,3),我需要得到该列表的超集(powerset)(没有重复元素).所以基本上我需要创建一个列表列表,如下所示:

{1}
{2}
{3}
{1, 2}
{1, 3}
{2, 3}
{1, 2, 3}
Run Code Online (Sandbox Code Playgroud)

实现这一点的最佳方式是什么(简单>效率在这种情况下,列表不会很大)?最好是在Java中,但任何语言的解决方案都是有用的.

Pet*_*hev 33

使用位掩码:

int allMasks = (1 << N);
for (int i = 1; i < allMasks; i++)
{
    for (int j = 0; j < N; j++)
        if ((i & (1 << j)) > 0) //The j-th element is used
           System.out.print((j + 1) + " ");

    System.out.println();
}
Run Code Online (Sandbox Code Playgroud)

以下是所有位掩码:

1 = 001 = {1}
2 = 010 = {2}
3 = 011 = {1, 2}
4 = 100 = {3}
5 = 101 = {1, 3}
6 = 110 = {2, 3}
7 = 111 = {1, 2, 3}
Run Code Online (Sandbox Code Playgroud)

你知道二进制中第一位是最右边的.