Skip to content

子集卷积

subset convolution · fast subset convolution

对一个集合的互补子集划分求卷积,并用按秩 zeta 与 Möbius 变换加速全部子集答案。

定义与直接枚举

令底集 Nn 个元素,f,g:2NR,其中 R 先取交换环。子集卷积定义为

(fg)(S)=TSf(T)g(ST).

每一项把 S 有序划分为 T 与互补部分;两部分不重叠且并集恰为 S。它不同于 XOR/OR/AND convolution,也不同于按整数下标相加的普通数值卷积

单个 S 需枚举 2|S|T。为全部 SN 计算时,成对数量为

SN2|S|=3n,

因为每个元素有“不在 S、在 T、在 ST”三种状态。位掩码循环减少常数,不改变 3n

三元素的状态表

S={a,b,c},卷积包含八项:T=S,三个单元素 T,以及三个双元素 T。例如 T={a,c} 的贡献是

f({a,c})g({b}).

f(A) 是“把块 A 作为第一部分的成本”,g(B) 是剩余部分方案数,这八项恰枚举所有有序二分。无序划分还要处理两部分交换对称,不能直接除以 2,因为空块或相同类型可能形成固定点。

按秩 zeta 变换

把函数按子集大小分层:

fk(S)={f(S),|S|=k,0,otherwise,

并定义 ranked zeta transform

f^k(S)=TSfk(T).

g 同样处理。接着在每个固定 S 上按秩做长度 n+1 的普通卷积:

h^k(S)=j=0kf^j(S)g^kj(S).

这一步会暂时包含相交的 f(A)g(B),因为只要求 A,BS|A|+|B|=k。不能把 h^ 直接当答案;消除相交项是下一步 Möbius 逆变换的职责。

Möbius 反演与取对角

对每个秩 k 做子集格上的反演:

hk(S)=TS(1)|ST|h^k(T).

最终答案取“秩与集合大小相等”的对角项

(fg)(S)=h|S|(S).

反演后仍满足 |A|+|B|=|S|AB=S 的项只能有 AB=,所以恰剩互补划分。这个基数论证是算法正确性的核心,而不是公式记忆。

复杂度账本

所有 k 的 zeta 与 Möbius 变换各做 O(n22n) 个环操作:有 n+1 层函数,每层 fast zeta transform 为 O(n2n)。每个 S 上的秩卷积也需 O(n2),合计

O(n22n)

时间。直接存所有 (k,S) 值需 O(n2n) 环元素;滚动或覆盖数组能降低常数,但反演前不能丢掉仍被秩卷积使用的层。

若只求一个目标集合 N,直接 2n 枚举反而更便宜;快速算法的优势是同时得到全部 S,常用于子集 DP的批量转移。

集合划分 DP

cost(A) 是把非空子集 A 作为一个块的成本,dpj(S) 是把 S 分成 j 个有序块的总权。则

dpj(S)=TSdpj1(T)cost(ST)

正是一层子集卷积。若目标是最小总成本,把求和与乘法换成 min 与加法会得到 min-sum 形式,但它不再处于有加法逆元的环中。

代数与数值边界

快速 Möbius 反演需要减法,因此标准 O(n22n) 算法在环上成立;普通半环只有加法与乘法,不能无条件执行交替符号消去。min-plus 变体常需有界整数权重编码、距离积或额外多项式因子,不能把环算法的界原样搬过去。

浮点环在代数上可写减法,但大量交替求和会放大消去误差;模环实现则要确保模数符合应用的计数语义。输入数组下标通常按 n 位 mask,n>w 时每次子集操作不再是单字常数。

参考资料
  • Andreas Björklund, Thore Husfeldt, Petteri Kaski, Mikko Koivisto, Fourier Meets Möbius: Fast Subset Convolution, STOC, 2007.
  • Petteri Kaski, Mikko Koivisto, Parameterized Algorithms and Inclusion–Exclusion, in Handbook of Exact Exponential Algorithms, 2011.
  • Marek Cygan et al., Parameterized Algorithms, Springer, 2015.