定义与直接枚举
令底集 有 个元素,,其中 先取交换环。子集卷积定义为
每一项把 有序划分为 与互补部分;两部分不重叠且并集恰为 。它不同于 XOR/OR/AND convolution,也不同于按整数下标相加的普通数值卷积公理库卷积Convolution · 卷积运算在加法群上把两份测度按加法映射推前,汇总所有可合成为同一输出的输入贡献。。
单个 需枚举 个 。为全部 计算时,成对数量为
因为每个元素有“不在 、在 、在 ”三种状态。位掩码循环减少常数,不改变 。
三元素的状态表
对 ,卷积包含八项: 与 ,三个单元素 ,以及三个双元素 。例如 的贡献是
若 是“把块 作为第一部分的成本”, 是剩余部分方案数,这八项恰枚举所有有序二分。无序划分还要处理两部分交换对称,不能直接除以 2,因为空块或相同类型可能形成固定点。
按秩 zeta 变换
把函数按子集大小分层:
并定义 ranked zeta transform
对 同样处理。接着在每个固定 上按秩做长度 的普通卷积:
这一步会暂时包含相交的 ,因为只要求 且 。不能把 直接当答案;消除相交项是下一步 Möbius 逆变换的职责。
Möbius 反演与取对角
对每个秩 做子集格上的反演:
最终答案取“秩与集合大小相等”的对角项
反演后仍满足 且 的项只能有 ,所以恰剩互补划分。这个基数论证是算法正确性的核心,而不是公式记忆。
复杂度账本
所有 的 zeta 与 Möbius 变换各做 个环操作:有 层函数,每层 fast zeta transform 为 。每个 上的秩卷积也需 ,合计
时间。直接存所有 值需 环元素;滚动或覆盖数组能降低常数,但反演前不能丢掉仍被秩卷积使用的层。
若只求一个目标集合 ,直接 枚举反而更便宜;快速算法的优势是同时得到全部 ,常用于子集 DP公理库子集动态规划Subset dynamic programming以所有子集为状态执行精确指数动态规划,并准确计算转移枚举量。的批量转移。
集合划分 DP
设 是把非空子集 作为一个块的成本, 是把 分成 个有序块的总权。则
正是一层子集卷积。若目标是最小总成本,把求和与乘法换成 min 与加法会得到 min-sum 形式,但它不再处于有加法逆元的环中。
代数与数值边界
快速 Möbius 反演需要减法,因此标准 算法在环上成立;普通半环只有加法与乘法,不能无条件执行交替符号消去。min-plus 变体常需有界整数权重编码、距离积或额外多项式因子,不能把环算法的界原样搬过去。
浮点环在代数上可写减法,但大量交替求和会放大消去误差;模环实现则要确保模数符合应用的计数语义。输入数组下标通常按 位 mask, 时每次子集操作不再是单字常数。
参考资料
- 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.