集合习题之列出有限集合所有子集

1、题目(《离散数学及其应用》第6版P75 20 题)

    给出可以列出有限集合所有子集的步骤。

2、  解题思路

假设有集合A = {a1, a2 … an},列出其所有子集。

  • 先列出含有1个元素的所有子集:{a1},{a2} … {an}
  • 然后列出含有2个元素的所有子集:{a1,a2},{a1,a3}…{an-1,an}
  • 同上所示,一直列到含有n个元素的所有子集

可以看出,问题就简化为求在 A 集合中,求含有固定 x 个元素的所有子集(注意,子集中每个ai只能包含一次)。

这实际上类似这么个问题,袋子中有编号为1到10的10个球,每次取一个球,取出后不放回袋子,取3次,问取出的3个球的编号可能的所有组合。

方法:

  • 取第1个球时,有1~10种取法
  • 取第2个球时,如果知道第1个球取的编号是a,则第2个球有除a以外的9种取法,但要注意{1,2}和{2,1}是同一个子集,如何保证不取已经取过了的同一组编号的球?

我们可以观察到如果让{1,2}2个球按编号大小排列只有一种排列方式即{1,2},所以只要保证第2个球的编号比第一个球的编号大,即可保证不会取到{2,1}

所以,我们可以在取第2个球时,从 (a+1) 开始取,即可保证不会取到重复的排列方式

同时,我们取第3个球时,一样需要知道第1、2个球的编号,这实际上就是一个递归问题了,假设已知取到第1个球为a,第2个球为b,则第三个球的取法为 {(b+1) …10)}

3、算法

//功能:从m个元素(元素不重复)中取出n个元素(n <= m)的所有取法
//参数:vectorHead = 前nBit_x - 1个元素已取了的头部vector
//参数:nHeadBit = 当前处理的元素在vectorSet中的位置
//参数:nBit_x = 当前要处理的子集的元素位置
//参数:nChildSetSize= 要取的n个元素的子集的大小
//参数:vectorSet = m个元素的总集
//参数:vectorChildSetBuffer = 存放子集的buffer
//返回:当前操作的步数
int    GetChildSetByDec(std::vector<int>& vectorHead, int nHeadBit, int nBit_x, int nChildSetSize, std::vector<int>& vectorSet, std::vector<std::vector<int>>& vectorChildSetBuffer)
{int    nRet  = 0;for (int i = nHeadBit; i < vectorSet.size(); i++){nRet++;std::vector<int>    vectorNewHead = vectorHead;vectorNewHead.push_back(vectorSet[i]);if (nBit_x == nChildSetSize - 1){//如果已经处理到最后一位了,则添加到buffer中
            vectorChildSetBuffer.push_back(vectorNewHead);}else{//如果还没处理到最后一位,则递归GetChildSetByDec(vectorNewHead, i + 1, nBit_x + 1, nChildSetSize, vectorSet, vectorChildSetBuffer);}}return    nRet;
}//功能:从m个元素(元素不重复)中取出n个元素(n <= m)的所有取法
//参数:nChildSize = 要取的n个元素的子集的大小
//参数:vectorBuffer = 存放所有数组的buffer
//参数:vectorSet = m个元素的总集
//返回:无
void    GetChildSet(std::vector<std::vector<int>>& vectorChildSetBuffer, std::vector<int>& vectorSet)
{//依次列出从1个元素到n个元素的集合for (int i = 1; i <= vectorSet.size(); i++){std::vector<int> vectorHead;GetChildSetByDec(vectorHead, 0, 0, i, vectorSet, vectorChildSetBuffer);}
}

 

说明:

  • 这里用的 vectorChildAggregateBuffer 来存放返回的子集,vectorChildAggregateBuffer 是一个STL容器中向量的向量,如果没有用过STL,可以理解为数组的指针(Array[][]),这里用Vector是为了存储操作方便。
  • GetChildAggregateByDec() 函数即用递归实现上面例子中10个球中取3个球的所有取法遍历。
  • GetChildAggregateByDec() 中运用了将n个元素映射为 Array[n] 数组一一对应的思想

程序运行结果:

image

 

如有其他思路解题,欢迎大家跟帖讨论

转载于:https://www.cnblogs.com/organic/p/5015246.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/272678.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# partial 关键字的使用

C# 2.0 引入了局部类型的概念。局部类型允许我们将一个类、结构或接口分成几个部分&#xff0c;分别实现在几个不同的.cs文件中。局部类型适用于以下情况&#xff1a;(1) 类型特别大&#xff0c;不宜放在一个文件中实现。(2) 一个类型中的一部分代码为自动化工具生成的代码&…

oracle中的输入 amp,Oracle之SQL学习

1.Oracle 更改会话(更改oracle中显示日期的方式)SQL> alter session set NLS_date_formatYYYY-MM-DD;2.使用绑定变量来输入记录(可以重复执行&#xff0c;输入记录)&#xff1a;SQL> insert into test1(id,name)2 values(&id, &name);输入 id 的值: 5输入 name…

线段的平移和旋转

//github不会用&#xff0c;试了很久不知道怎么上传代码 #include <iostream> using namespace std;#include <stdlib.h> #include <Eigen/Dense> #include <math.h> using namespace std; using Eigen::MatrixXd; int main() { int option; struct p…

我不问+你不说

阅读原文很多事我不问你不说这就是距离我问了你不说这就是隔阂我问了你说了这就是尊重你想说我想问这就是默契我不问你说了这就是信任很多事情你看到的听到的未必是你想象的那样人生在世多给别人机会解释多些向别人解释的耐心人生会少很多遗憾不问、不说、不解释这不是酷或有个…

怎么安装redhat linux操作系统,红帽RedHat Linux5系统安装指南

介绍如何安装linux操作系统&#xff0c;以目前市场主流的操作系统为例子进行介绍。1、放入安装dvd光盘&#xff0c;然后启动服务器&#xff0c;可得如下画面&#xff1a;2、按enter键&#xff0c;进入如下画面3、选择skip&#xff0c;按enter进入&#xff0c;下面画面&#xff…

Net中的Request和Response对象的理解

Request 和 Response 对象起到了服务器与客户机之间的信息传递作用。Request 对象用于接收客户端浏览器提交的数据&#xff0c;而Response 对象的功能则是将服务器端的数据发送到客户端浏览器。一、Request对象的五个集合&#xff1a;QueryString&#xff1a;用以获取客户端附在…

研华工控机u盘启动安装linux系统,研华工控机怎么设置u盘启动

本文主要介绍研华IPC如何设置u盘启动研华IPC-610 IPC随XP版一起安装。有时安装控制软件需要在不满意时卸载。卸载未完成&#xff0c;这使得安装无法进行&#xff0c;因此您需要将系统恢复到相对纯粹的时间。通常&#xff0c;USB磁盘启动盘的安装系统首先备份初始纯XP作为备份&a…

UVA - 11732 strcmp() Anyone?左兄弟右儿子trie

input n 2<n<4000 s1 s2 ... sn 1<len(si)<1000 output 输出用strcmp()两两比较si,sj(i!j)要比较的次数&#xff0c;结果在long long范围内&#xff08;相同字符比较两次&#xff0c;不相同字符比较一次&#xff0c;包括\0&#xff09; 做法&#xff1a;由于字符集…

防止SQL注入式攻击的笔记

SQL注入式攻击是指利用设计上的漏洞攻击系统。如果动态生成SQL语句时没有对用户输入的数据进行过滤&#xff0c;便会使SQL注入式攻击得逞。例如用下面的SQL语句判断用户名和密码&#xff1a;txtsql"select * from user_info where userid"&txtuserid &"…

linux输入一个用户看是否在工作,linux下的用户管理详解

linux下的用户管理详解useradd 命令详解添加用户想要对linux下面的帐号了解的话首先必须要了解的4个配置文件[rootlocalhost /]# cat /etc/passwd首先我们需要了解的是用户帐号的配置信息/etc/passwd里面的内容每个字段都以:分割&#xff0c;下面我们详细的看看每个字段的意思r…

Java命令学习系列(零)——常见命令及Java Dump介绍

Java命令学习系列&#xff08;零&#xff09;——常见命令及Java Dump介绍 一、常用命令&#xff1a; 在JDK的bin目彔下,包含了java命令及其他实用工具。  jps:查看本机的Java中进程信息。  jstack:打印线程的栈信息,制作线程Dump。  jmap:打印内存映射,制作堆Dump。  …

优秀程序员的十个习惯

在这个世界上&#xff0c;有数百万的人热衷于软件开发&#xff0c;他们有很多名字&#xff0c;如&#xff1a;软件工程师&#xff08;Software Engineer&#xff09;&#xff0c;程序员&#xff08;Programmer&#xff09;&#xff0c;编码人&#xff08;Coder&#xff09;&…

linux下jmap 内存命令,Linux下jmap命令查看内存使用

Linux下jmap命令查看内存使用jmap -heap 1234(1234为进程号)jmap是JDK自带的一个工具&#xff0c;非常小巧方便&#xff0c;其支持参数如下&#xff1a;-heap打印heap空间的概要&#xff0c;这里可以粗略的检验heap空间的使用情况。例&#xff1a;jmap -heap 12345输出&#xf…

BZOJ3144: [Hnoi2013]切糕

题目&#xff1a;http://www.lydsy.com/JudgeOnline/problem.php?id3144 把每一条z轴都拿出来&#xff0c;s->(x,y,1),cf[x][y][1];(x,y,k)->(x,y,k1),cf[x][y][k];(x,y,r)->t,cinf 然后对于四联通的点&#xff0c;(x,y,z)->(x,y’,z-d) 似乎这叫经典的最小割模型…

如何通俗地解释 C、C++、C#、Java、JavaScript、HTML、Python的用处

世界上本来没有计算机&#xff0c;工程师创造了它。为了让告诉计算机需要做什么事情&#xff0c;工程师发明了程序设计语言。简单粗暴的编程&#xff1a;C语言&#xff1a;用来学编程&#xff1b;C语言&#xff1a;用来使劲儿学编程&#xff1b;C#&#xff1a;用来在windows操作…

安卓linux交叉编译,Linux Ubuntu下用Android NDK 生成独立交叉编译链

本文主要介绍使用Android NDK生成独立交叉编译链&#xff0c;然后使用独立交叉编译链编译Android程序下载NDK下载与自己操作系统相吻合的版本 下载地址解压到安装目录(如~/myndk):tar -zxvf android-ndk-r14b-linux-x86_64将NDK的根目录生成一个环境变量打开~/.bashrcw文件&…

数据结构——各排序算法的比较

1.从时间复杂度比较   从平均时间复杂度来考虑&#xff0c;直接插入排序、冒泡排序、直接选择排序是三种简单的排序方法&#xff0c;时间复杂度都为O(n2)&#xff0c;而快速排序、堆排序、二路归并排序的时间复杂度都为O(nlog2n)&#xff0c;希尔排序的复杂度介于这两者之间。…

将c程序移植到linux,各位大侠:我把原来在linux运行的c程序移植到HPUNIX上出现了错误...

各位大侠&#xff1a;我把原来在linux运行的c程序移植到HPUNIX上出现了错误(2012-04-11 00:43:47)标签&#xff1a;linuxc程序杂谈各位大侠&#xff1a;我把原来在linux运行的c程序移植到HP_UNIX上出现了错误makefileCC aCC -AA W829 DD64 DAportable-I/ods/app/oracle/produc…

数据库学习建议之提高数据库速度的十条建议

很多网站的重要信息都是保存在数据库中的&#xff0c;用户通过提交访问数据库来获取用户信息。如果数据库速度非常的快&#xff0c;有助于节省服务器的资源&#xff0c;在这篇文章中&#xff0c;我收集了十个优化数据库速度的技巧。0. 小心设计数据库第一个技巧也许看来理所当然…

Java中数据类型的取值范围

整数数据类型的取值范围 我们都知道计算机的底层是二进制&#xff0c;也知道不同的整数类型存储值的范围不同&#xff0c;可这些数值在计算机底层是怎样存储的呢&#xff1f;数值范围又是怎么计算出来的呢&#xff1f; 下面以java来进行举例&#xff1a; byte 1个字节 (8bit…