[Entertain] 一则容斥原理复杂度分析
[Entertain] 一则容斥原理复杂度分析
可以感受推式子的过程其实是无意间在用组合意义转化的
本文同一用 \(\cap\) 表示按位与,\(\cup\) 表示按位或,\(\vert S\vert\) 表示 \(\operatorname{popcount}(S)\)。
有一个对于所有 \(S\in[0,2^n-1]\) 的所有 \(S\) 计算 \(f_{i}=\sum_{T}[|S\cap T|=i]\) 的容斥过程,总复杂度表示为:
\[\sum_{S}|S|\sum_{T\subseteq S}1
\]
转化求和顺序
\[\sum_{T}\sum_{T\subseteq S}|S|
\]
在此处放缩 \(|S|\le n\) 可以得到原式的上界 \(\mathcal O(n3^n)\)。但是稍后说明这也是它的下界。
转写 \(|S|\)
\[\sum_{T}\sum_{T\subseteq S}\sum_{i=0}^{n-1}[S[i]=1]
\]
调换求和顺序
\[\sum_{i=0}^{n-1}\sum_{T}\sum_{T\subseteq S}[S[i]=1]
\]
拆开后面部分,下设 \(U=2^n-1\),则 \(U\setminus S\) 就是 \(S\) 按位取反。
\[\sum_{i=0}^{n-1}\sum_{T}(2^{|U\setminus T|}[T[i]=1]+[T[i]=0]2^{|U\setminus T|-1})
\]
换成
\[\sum_{i=0}^{n-1}\sum_{T[i]=1}2^{n-|T|}+\frac{1}{2}\sum_{i=0}^{n-1}\sum_{T[i]=0}2^{n-|T|}\tag{F(n)}
\]
可知
\[\Theta(F(n))=\sum_{i=0}^{n-1}\sum_{T}2^{n-|T|}
\]
集合与它的补集是一一对应的,转写成
\[\sum_{i=0}^{n-1}\sum_{T}2^{|T|}
\]
枚举集合大小
\[n\sum_{i=0}^{n}{n\choose i}2^i
\]
式子的后半部分是二项式定理展开 \((1+2)^n\) 的结果
\[n(1+2)^n=n3^n
\]
故原式复杂度 \(\Theta(n3^n)\)。
本文来自博客园,作者:haozexu,转载请注明原文链接:https://www.cnblogs.com/haozexu/p/18832240