子集生成方法

Posted h_hg

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了子集生成方法相关的知识,希望对你有一定的参考价值。

问题

输出n个元素的所有子集,如{a,b,c}的子集为{},{a},{b},{c},{a,b},{a,c},{b,c},{a,b,c}

解决

方法1

如果这些子集用0/1表示的话,可表示为000,001,010,100,110,101,011,111,其中1表示这个元素属于这个子集,0表示不属于。

这种0/1表示法让我想到了数据在内存中的存放也是0/1,所以下面用这种思路解决这个问题。

#include <iostream>
#include <cstring>
using namespace std;
void SubsetGeneration(const char *s)
{
    unsigned long long n = 1;
    int len = strlen(s);
    for(int i = 0;i < len;++i)
        n *= 2;
    --n;//n个1组成的数等于 2^n-1
    for(unsigned long long i = 0;i <= n;++i)
    {
        unsigned long long temp = i;
        cout << i+1 << ‘:‘;
        for(int j = 0;j < len;++j)
        {
            if(temp & 1)//判断s中最前位为1还是0
                cout << s[j];
            temp  >>= 1;//将s往后移动1位
        }
        cout << endl;
    }
}
int main()
{
    char a[sizeof(long long)+1];
    while(cin >> a)
    {
        SubsetGeneration(a);
    }
    return 0;
}

撇开运算效率的问题,这种做法无法解决元素数大于sizeof(long long)

以上是关于子集生成方法的主要内容,如果未能解决你的问题,请参考以下文章

子集生成方法

为表的子集生成序列

如何为字符串生成所有可能的(n 长度)子集?

VS Code配置snippets代码片段快速生成html模板,提高前端编写效率

子集生成模板

子集生成与字典序