首页 > 其他 > 详细

枚举子集

时间:2021-03-17 22:58:44      阅读:28      评论:0      收藏:0      [点我收藏+]

Part I. 概念

一个二进制状态,第 \(i\)\(1\) 表示 \(i\) 在集合中,反之为不在集合中,求这个集合所有子集(可以为空)的二进制状态。

例如 \(1101\) 的所有子集为 \(0000,0001,0100,0101,1000,1001,1100,1101\)

常用作状压 dp。

Part II. 怎么求

(假设要枚举的二进制串为 \(s\)

for(int i=s;;i=i-1&s)
{
    printf("%d\n",i);
    if(!i) break;
}

Part III. 性质

假设一个数 \(x\) 的子集数量为 \(f(x)\),那么:

\[\mathcal O(\sum\limits_{i=1}^{2^n-1} f(i))=\mathcal O(3^n) \]

证明:(https://www.acwing.com/community/content/513/

\(x\) 二下有 \(k\)\(1\),那么显然 \(\mathcal O(f(x))=\mathcal O(2^k)\)\([1,2^n)\) 中恰好 \(1\) 位二进制的有 \(\mathcal O(\mathrm C_n^1)\) 个,\(2\) 位有 \(\mathcal O(\mathrm C_n^2)\) 个,以此类推,可以得到:

\[\begin{align*}\mathcal O(\sum\limits_{i=1}^{2^n-1} f(i))&=\mathcal O(\sum\limits_{i=1}^n \mathrm C_{n}^i2^i)\\&=\mathcal O((2+1)^n)\\&=\mathcal O(3^n)\end{align*} \]

一般用来计算复杂度。

枚举子集

原文:https://www.cnblogs.com/juruo-zzt/p/14551815.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!