码迷,mamicode.com
首页 > 其他好文 > 详细

集合的整数表示

时间:2020-05-08 12:56:04      阅读:83      评论:0      收藏:0      [点我收藏+]

标签:判断   ima   产生   sub   完成   交集   操作   false   als   

【基本的集合操作】:

(1) 空集Ø ------------------------------------------------------------> 0

(2)只含有第 i 个元素的集合{ i } ----------------------------------> 1 << i

(3)含有全部 n 个元素的集合{0, 1, ..., n-1} --------------> (1 << n) - 1

(4)判断第 i 个元素是否属于集合 S ------------------------------> if (S >> i & 1)

(5)向集合中加入第 i 个元素 S υ { i } ----------------------------> S | 1 << i

(6)从集合中删去第 i 个元素 S \ { i } -----------------------------> S & ~ (1 << i)

(7)集合 S 和 T 的并集 S υ T -------------------------------------> S | T

(8)集合 S 和 T的交集 S ∩ T --------------------------------------> S & T


 

枚举基和S={0,1,2...,n-1}中的所有子集都枚举出:

for(int S=0;S<1<<n;S++){
    // 对子集的处理
}

  

【降序遍历子集】:

int sub = sup;
do{
	sub = (sub - 1) & sup;
   }while(sub != sup);

  

【枚举包含所有大小位k的子集】:

 while(comb < (1 << N))
 {
      int x = comb & -comb, y = comb + x;
      comb = (comb & ~y) / x >> 1 | y;
 }

  

解析:

x = comb & -comb 可以获取最低位的1
y = comb + x 将最低位的连续1变成0,高一位变成1(新的1)
comb & ~y 获取最初的连续的1区间
(comb & ~y) / x >> 1 获得最初的连续1区间然后把最低的1移走维持1的数量不变且是新产生1中最小的。
(comb & -y) / x >> 1 | y 状态更新。

总的说完成的操作是:在最低位的连续1区间前一位产生一个1(最小),然后把这个区间一起右移直到少了一个1维持1的数量不变,且是按顺序枚举。

技术图片

 

集合的整数表示

标签:判断   ima   产生   sub   完成   交集   操作   false   als   

原文地址:https://www.cnblogs.com/jaszzz/p/12849648.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!