今天我们来看一下子集的问题。

题目描述:给定一个任意集合A,集合的长度为Length,让你打印出这个集合中所包含的所有子集。

题目分析:此问题实际上也是一个遍历树的问题,进行遍历每一个子元素,再进入下层函数时候记录上层结果,加入到下层函数中,再存储起来。其实总结器来他就是一颗完全二叉树。以下我们结合图来具体的说一下:

我们以集合{1,2,3}来对此画树状图理解一下。图如下:

以此我们可以得到集合{1,2,3}中的子集有{},{1},{2},{3},{1,2},{1,3},{2,3},{1,2,3};

以此我们就可以用递归算法对其进行代码操作。

具体的递归方法:对于一个含有n个元素的集合,我们要对其进行找子集,首先我们需要先定义一个数组,以此来存储对这N位的2进制数来表示这个集合,第i为如果为1则表示第i个元素在表示的这个集合中,否则则不再这个集合中。简单的来说就是首先我们先让这个数组的第一个元素为No,然后他会一直往下找,如果到递归结束时还是No,就将它打印出来,然后进行回溯到上一层。然后我们就把这个元素定位Yes,然后在进行在Yes条件下进行递归寻找,我们每次进行到递归结束的条件时,我们对其进行回溯。可能我说的还是有点理解不了,大家可以结合着上面的图来看代码:

#include<stdio.h>
#include<string.h>
#include<assert.h>int arr[]={0};//存储当前第i个位置元素包含还是不包含
void Ziji(char brr[],int k,int length)//k是递归的层次,k与集合的长度有关
{assert(arr!=NULL); if(k==length)//递归结束的条件{printf("{ ");for(int i=0;i<length;i++){if(arr[i]==1){printf("%c ",brr[i]);}}printf("}");printf("\n"); }else{arr[k]=0;//集合中的第i个元素没有包含,也就是(No)Ziji(brr,k+1,length); //进行没有被包含(No)的递归arr[k]=1;//集合中的第i个元素被包含(Yes)Ziji(brr,k+1,length);//然后进行被包含下(Yes)的递归}
}
int main()
{char str[]="ABC";int lenth=strlen(str);Ziji(str,0,lenth);return 0;
}

综上所述呢,我们可以得到一个含有N个元素的集合,它的所有子集的个数为N!个。

大家现在结合着代码是不是理解了此算法的递归操作呢?

如果没理解我再给大家讲一下非递归的算法,我觉得这种办法挺好运的,这种办法就是用C++中的位运算符来进行操作的,上面我们可以得出一个含有N个元素的集合,它的所有子集的个数为N!个,于是我们对其进行移位操作。

如集合A={a,b,c},其子集个数为8;对于任意一个元素,在每个子集中,

要么存在,要么不存在,对应关系是:

a->1或a->0

b->1或b->0

c->1或c->0

映射为子集:

(a,b,c)

(1,1,1)->(a,b,c)

(1,1,0)->(a,b   )

(1,0,1)->(a,   c)

(1,0,0)->(a      )

(0,1,1)->(   b,c)

(0,1,0)->(   b   )

(0,0,1)->(      c)

根据以上规律我们可以得出拿一个整形值与一个数进行&操作可以得到我们所需要的子集。进行再一步的观察我们可以看出这个数就是1,每次进行&之后,让这个数进行左移(<<)i位,这个i的初始为0,结束为N,所以我们就可以求出我们所需要的结果,具体代码如下:

#include<stdio.h>
#include<assert.h>
#include<string.h>
int main()
{char arr[]="ABC";int a=strlen(arr);int thm=1<<a;//含有N个元素的子集共有N!个for(int i=0;i<thm;i++){for(int j=0;j<a;j++)if(i&1<<j)//每次要对其进行左移操作,然后又i进行&{printf("%c",arr[j]);   }printf("\n");}return 0;
}

以上的内容就是我对一个集合中求子集问题的所有理解,希望它可以帮助大家。如有错误,请大家评论指正。

回溯法经典算法 求集合中所有的子集相关推荐

  1. (转)回溯法-算法框架及基础

    好,顶 原文地址:(转)回溯法-算法框架及基础作者:jinyang6655 转自http://lilongfei1030.blog.163.com/blog/static/86015282008720 ...

  2. 二进制拆弹实验详解_Population Count算法-求二进制数中1的个数

    所谓Population Count算法,即是指计算一个二进制数中1的个数的算法.具体来说,就是任意给定一个无符号整数N,求N的二进制表示中1的个数,比如N = 5(0101)时,返回2:N = 15 ...

  3. 求集合中最大值、最小值、和

    求集合中最大值.最小值.和 public class Demo5 {public static void main(String[] args) {List<Integer> nums = ...

  4. 回溯法——回溯法的算法思想

    参考了一篇写的较好的博客 [回溯算法] 五大常用算法之回溯法_GoRustNeverStop的博客-CSDN博客_回溯算法 简单来说,回溯法是一个在所有可能性中寻找最优解的问题,但与遍历所有路径的全遍 ...

  5. 【回溯法】01 - 回溯法的算法框架

    回溯法以深度优先策略搜索解空间树. 1. 用回溯法解题时,要明确定义问题的解空间树. 2. 通常将解空间树组织成树或图的形式. 回溯法求解问题的所有解时,要回溯到根,且根节点的所有子树都已被搜索到才结 ...

  6. JAVA求集合中的组合

    好几个月没弄代码了,今天弄个求组合的DEMO 思路是将集合的每个值对照一个索引,索引大小是集合的大小+2.索引默认为[000...000],当组合后选取的组合值demo为[0100..00].然后根据 ...

  7. oracle快速排序法,经典算法系列之快速排序算法

    快速排序(Quicksort)是对冒泡排序的一种改进.由C. A. R. Hoare在1962年提出.在平均状况下,排序 n 个项目要Ο(n log n)次比较.在最坏状况下则需要Ο(n2)次比较,但 ...

  8. 回溯法经典例题--0/1背包问题--C语言

    问题描述:         设n个物品的编号为0~n-1,重量和价值分别用数组w[]与v[]存放,背包限制重量用W表示,X[]存放最优解,x[i]的值为0.1分别表示物品i不在.在背包内. 求解:   ...

  9. 求0到7组成奇数的个数c语言,c语言经典算法—求0—7 所能组成的奇数个数

    题目:求0-7 所能组成的奇数个数. 算法思想: 这个问题其实是一个排列组合的问题,设这个数为sun=a1a2a3a4a5a6a7a8,a1-a8表示这个数的某位的数值, 当一个数的最后一位为奇数时, ...

最新文章

  1. Java Web架构知识整理——记一次阿里面试经历
  2. 在CISCO上做单臂路由
  3. 算法与数据结构(part3)--数据结构概述
  4. 【codeforces 239B】Easy Tape Programming
  5. 不裁员也好意思叫互联网公司?
  6. Navicat 连接Oracle时提示oracle library is not loaded的问题解决
  7. .NET Framework-多线程网络编程
  8. SpringMVC【一 简单入门例子】
  9. restclient发送json_如何使用restclient来发送post请求参数
  10. 基于C#的图书管理系统
  11. SpringBoot快速开始magic-api基础
  12. 非模式物种ROSE超级增强子鉴定分析详解
  13. 学习制作横版游戏——2
  14. JedisNoReachableClusterNodeException: No reachable node in cluster
  15. python ndarray 与 base64 互转 接口传递ndarry
  16. stm32 读取sd卡图片显示_「正点原子STM32Mini板资料连载」第三十五章 汉字显示实验...
  17. 如何在 Windows 上 使用 ONLYOFFICE 协作编辑文档
  18. 政府采购网上商城是不是未来的趋势
  19. 操作系统 --经典同步问题之吸烟者问题读者-写者问题(七)
  20. Qt练习:多线程串口通信

热门文章

  1. iOS ideviceinstaller安装ipa报错zip_open
  2. 微信小程序H5预览页面框架
  3. Codeforces 786A Berzerk(博弈)
  4. vp230引脚功能_正点原子阿波罗STM32F767
  5. ps教学之logo设计。
  6. ThinkPhp5.0.24 JWT报错 ‘“kid“ empty, unable to lookup correct key‘解决办法
  7. BCD码-8421码、5421码、2421码、余3码
  8. 淘宝搜索功能测试用例
  9. TikTok上的美金,如何提现到PayPal
  10. 古早软件 vim的使用