集合的整数表示——二进制表示法
使用情况
只有当集合中的元素比较少的时候,才能用这种方法来表示。
原理
f(S) = sum(2^i),
其中,i为属于集合的元素的所有下标。
用法
空集 —— 0
只含第i个元素的集合 —— 1<> i & 1)
向集合中加入第i个元素 —— S | 1 << i
从集合中去除第i个元素 —— S & ~(1 << i)
合并集合S与T —— S | T
集合S与T相交 —— S & T
举例
1. 枚举任意集合sup的所有子集
int sub = sup;
do
{
sub = (sub - 1) & sup;
} while(sub != sup);
处理完0之后,会有-1 & sup =sup,满足截止的条件
2. X&(-X) —— 取出最低位的1
因为-X实际上对应着(~X) + 1的补码
因此,X & (-X)可以取出X化为二进制数后的最低位的1
3. 枚举{0,1,…,n-1}所包含的所有大小为k的子集
要求:按照字典序升序枚举出所有满足条件的二进制码
int comb = (1 << k) - 1;
while (comb < 1 << n)
{
int x = comb & -comb;
int y = comb + x;
comb = ((comb & ~y) / x >> 1) | y;
还没有评论,来说两句吧...