枚举二进制集合的非空子集

使用二进制描述一个非空集合,例如:\(A=\{a,b,c\}\),其非空子集有:\(\{a\},\{b\},\{c\},\{a,b\},\{a,c\},\{b,c\},\{a,b,c\}\) 共 7 个,可以用二进制描述为:\(001,010,100,011,101,110,111\),对于一个包含 \(n\) 个元素的集合,求其非空子集的实现代码如下:

for (int i = 1; i < (1<<n); ++i) {
	for (int j = i; j; j = (j-1) & i) {
		// code
	}
}

时间复杂度证明如下(这里多包含了一个空集 \(\phi\),不影响计算结果,可以忽略):

  1. 对于任意一个 \(i\),求它的所有 \(j\),时间复杂度为:\(\sum_{k=0}^iC_i^k = 2^i\)
  2. 对于 \(i\in [0,2^n)\) 的所有子集,\(\sum_{i=0}^nC_n^i\cdot2^i=(1+2)^n=3^n\)

如果要枚举算上空集的所有子集,可以这样写:

for (int i = a; ; i = (i-1) & a) {
	cout << i << "\n";
	if (!i) break;
}
posted @ 2024-11-13 10:02  飞花阁  阅读(44)  评论(0)    收藏  举报
//雪花飘落效果