紫书之子集生成三种算法

简介: 紫书之子集生成三种算法

问题描述:

给定一个集合,比如{1,2,3,4},要生成所有的子集(不包括空集,也就是2^n-1个集合)

注: n个元素集合有2^n个子集.


1.增量构造法

思路:在已有子集的基础上不断增加新的元素,一直到无法继续添加为止. 另外因为我们排序的是数组的索引,是从小到大的,就不会出现重复的了.

参考代码

#include<iostream>
#include<cstdio>
using namespace std;
int A[101];//存放集合元素下标的的数组
void print_subset(int n,int *A,int cur){//cur:当前A序列中元素的个数.   
  for(int i = 0;i < cur;i++){//打印当前集合,每次进入都要进行打印 
    printf("%d",A[i]);
  }
  printf("\n");
  int s = cur ? A[cur-1]+1:0; // 确定下一个元素的最小值
  for(int i = s; i < n;i++){//从前往后进行枚举  第一次 A 一定包含A[s]元素, 第二轮则是一定包含A[s+1]元素  A序列中的元素一定都是从小到达的 
    A[cur] = i;
    print_subset(n,A,cur+1);//继续构造子集. 
  } 
} 
int main()
{
  int n;
  scanf("%d",&n);
  print_subset(n,A,0);
  return 0;
} 

运行结果:

20210618172839739.png

2.位向量法

思路:使用一个数组来进行标记对应位置的元素是否存在,标记位置为0表示不存在,为1表示存在.

参考代码
#include<iostream>
#include<cstdio>
using namespace std;
int B[10];
void print_subset(int n,int *B,int cur){
  if(cur==n){
    for(int i = 0; i < cur;i++){
      if(B[i]){
        printf("%d",i); 
      }
    }
    printf("\n"); 
    return;
  }
  B[cur] = 1;//选第cur个元素
  print_subset(n,B,cur+1);
  B[cur] = 0;//不选第cur个元素
  print_subset(n,B,cur+1); 
} 
int main()
{
  int n;
  scanf("%d",&n);
  print_subset(n,B,0);
  return 0;
}

运行结果

20210618173130940.png


3.二进制法

有点复杂,自己目前还有点迷糊.

#include<cstdio>
#include<iostream>
using namespace std;
void print_subset(int n,int s){
  for(int i = 0;i < n;i++){
    if(s&(1<<i)){
      printf("%d",i);
    }
  }
  printf("\n");
}
int main()
{
  int n;
  scanf("%d",&n);
  for(int i = 0; i < (1<<n);i++){//  
    print_subset(n,i);
  }
  return 0;
}
相关文章
|
3月前
|
算法
什么是退火算法
什么是退火算法
106 0
|
8月前
|
存储 并行计算 算法
FlashAttention算法详解
这篇文章的目的是详细的解释Flash Attention,为什么要解释FlashAttention呢?因为FlashAttention 是一种重新排序注意力计算的算法,它无需任何近似即可加速注意力计算并减少内存占用。所以作为目前LLM的模型加速它是一个非常好的解决方案,本文介绍经典的V1版本,最新的V2做了其他优化我们这里暂时不介绍。因为V1版的FlashAttention号称可以提速5-10倍,所以我们来研究一下它到底是怎么实现的。
369 0
|
算法 数据安全/隐私保护
《算法》世界 二
一.算法要素 1.数据对象的运算和操作:计算机可以执行的基本操作是以指令的形式描述的。一个计算机系统能执行的所有指令的集合,成为该计算机系统的指令系统。一个计算机的基本运算和操作有如下四类: 1.算术运算:加减乘除等运算 2.逻辑运算:或、且、非等运算 3.关系运算:大于、小于、等于、不等于等运算 4.数据传输:输入、输出、赋值等运算 2.算法的控制结构:一个算法的功能结构不仅取决于所选用的操作,而且还与各操作之间的执行顺序有关。
116 1
《算法》世界 二
|
存储 算法 搜索推荐
C#算法大全(上)
今天有人想让我搞一期C#算法大全。算法就算法,安排上!
|
算法
算法题
1.厘米换算英尺英寸 分析:题目非常简单,但是今晚喝的有点多,有点迷 如果已知英制长度的英尺foot和英寸inch的值,那么对应的米是(foot+inch/12)×0.3048。现在,如果用户输入的是厘米数,那么对应英制长度的英尺和英寸是多少呢?别忘了1英尺等于12英寸。
426 0
算法题
|
算法 Java C++
算法题0
第一题:判断数字 给定一个整数 n,请你统计其各位数字中 4 和 7 的出现次数。 如果 4 的出现次数加上 7 的出现次数恰好等于 4 或 7,则输出 YES,否则输出 NO。 例如,当 n=40047 时,4 出现了 2 次,7 出现了 1 次,2+1=3,既不是 4 也不是 7,因此,输出 NO;当 n=7747774 时,4 出现了 2 次,7 出现了 5 次,2+5=7,因此,输出 YES。
130 0
|
算法 C++
|
算法
算法技巧总结
算法技巧总结
1351 0