子集枚举介绍

集合枚举的意思是从一个集合中找出它的所有子集。集合中每个元素都可以被选或不选,含有n个元素的集合总共有2^{n}个子集(包括全集和空集)

例如考虑集合A=\left \{ 1,2,3,4,5 \right \}和它的4个子集A_{1}=\left \{ 1,3,4,5 \right \}A_{2}=\left \{ 1,4,5 \right \}A_{3}=\left \{ 3 \right \}A_{4}=\left \{ 2,3 \right \},按照某个顺序,把全集A中的每个元素在每个子集中的出现状况用0(没出现)和1(出现了)表示出来。

A中元素12345二进制对应十进制
在A1中的出现情况1011111101a1=29
在A2中的出现情况1001110011a2=25
在A3中的出现情况0010000100a3=4
在A4中的出现情况0110000110a4=6

通过上面的表格就可以发现A的子集A1可以表示为一个二进制数11101,对应十进制变量a1=29,反之,这个数字也可以表示子集A1。注意,这边的集合是大写字母,集合对应的数字是小写字母。同理,A2可以表示为二进制数11001。此时找到了一种让子集对应于二进制数的很直观的方法

本例一共有5个元素,表示仅包含第i个元素的集合的数字可以使用位移运算构造,写成1<<(i-1),即2^{i-1},例如要找仅包含第3个元素的集合,那么找a=1<<(3-1),也就是4,此时对应的二进制数为00100,也就是集合{3}。而包含所有元素的全集可以表示成a=(1<<n)-1,空集表示为0。

一些常用的集合关系:

(1)并集:从元素选择角度来说,就是A2、A3包含的元素合并起来能够得到A1。可以发现A1的每一位都等于A2 or A3的结果。变成验证可得a1=a2|a3。只需要把表示两个子集的二进制数进行或运算即可得到两个子集的并集。

(2)交集:是指两个集合中同时存在的元素组成的集合。类似前面的并集运算,当需要两个子集的交集时,可以把表示两个子集的二进制数进行与运算,即a3=a1&a4。

(3)包含:集合A2的所有元素都在A1中出现,说明A1包含A2。易知A1并A2是A1,同时A1交A2是A2,也就是判断A1是否包含A2可以写成(a1|a2==a1)&&(a1&a2==a2)

(4)属于:是指某个元素在集合中,是包含的一种特殊情况--只需检查单独某项元素构成的集合是否是另一个集合的子集。一般地,可以使用户左移运算构造出那个仅含一项的集合,然后再和原集合取交,若不为空集,则命题为真。如果要判断第3个元素是否属于A1,可以写成1<<(3-1)&a1

(5)补集:是指全集去除了某个集合后剩下元素组成的集合。可以使用异或运算来表示集合对全集的补集,例如A2对于全集的补集就是A3。A2的补集可以表示为a^a2。

 注意:枚举子集的时间复杂度是O\left ( 2^{n} \right ),一般情况下1秒钟可以枚举包含20-30个元素的集合的子集。

具体的例题运用,可以参照此专栏的题解。

P1036 [NOIP2002 普及组] 选数题解-CSDN博客

P1157 组合的输出题解-CSDN博客

  • 27
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

互联网的猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值