Skip to content

方法Method

Meet-in-the-Middle

施工中 · 内容逐步修订

Meet-in-the-middle

枚举两半指数状态并以排序或哈希匹配,用空间把枚举指数减半。

形式陈述 ​

范式 ​

对每个变量只有选或不选两种选择的问题,用分治把 n 个变量分成大小 ⌊n/2⌋ 与 ⌈n/2⌉ 的两组,分别枚举部分状态,再做兼容查询。以整数 Subset Sum 为例,生成左右子集的和列表 L,R,对每个 x∈L 查找 T−x∈R。两张列表分别有 2⌊n/2⌋ 与 2⌈n/2⌉ 项,合计为 O(2n/2)。 由此得到

O(2n/2poly(n))

时间,显式列表通常占 O(2n/2) 个记录。每个和保留其对应选择;计数时还要保留重复和的重数。

空输入只含空子集,恰在目标为零时成功。其他变量域也能分半枚举,但状态数取决于每个变量的选择数,不能统一写成二进制选择的指数。

直觉

直接枚举全部组合要付 2n;把变量分半后,任一完整解都可写成一个左状态与一个右状态的兼容配对。显式存下一侧的短摘要,就能用排序、双指针或哈希查补值,把笛卡尔积搜索换成两张约 2n/2 的表。

Meet-in-the-Middle 的两半枚举与补值匹配
例子与边界

Subset Sum 全程执行 ​

数列 (3,5,8,11)、目标 16,分成 (3,5) 与 (8,11)。左和为 (0,3,5,8),右和为 (0,8,11,19)。对左和 5 查补值 11 命中,恢复子集 {5,11}。列表项必须携带 bitmask,否则只能回答存在而不能重构方案。

排序双指针从最小左和与最大右和开始:和过大就向左移动右指针,过小就向右移动左指针。若求方案数,重复和要压成 (value,multiplicity),命中时乘两侧次数;简单去重会丢解。若只问存在,哈希 membership 已足够。

成本和空间 ​

对 n≥1,两半列表的直接生成和比较排序合计为

O(n2n/2+2n/2log⁡2n/2)=O(n2n/2),

双指针扫描线性,空间为 O(2n/2) 个记录。这里假定所有部分和、掩码与列表地址可放入机器字,整数运算与比较为单位成本;否则另计表示和位运算成本。使用哈希时,固定输入独立于随机种子、负载受控且哈希求值为常数成本,才有相应的期望查询界;比较排序不需要这项随机假设。

Schroeppel–Shamir 把变量均分成四组,各自存储约 2n/4 个子集和。若第一、二组的排序列表为 A,B,对每个 Ai,该行 Ai+B0,Ai+B1,… 已有序。最小优先队列只保存每行尚未输出的首项;取出 (i,j) 后放入 (i,j+1),就能依次生成两组合并后的和,而不保存全部配对。另两组反向用最大优先队列生成降序和,再用两端匹配。列表与队列只占 O(2n/4) 个记录,朴素二叉堆实现的总时间为 O(n2n/2);这些界仍采用上述单字记录与算术假设。

失效边界 ​

若跨半兼容条件不能由短摘要判断,组合检查可能退回 2n 的笛卡尔积;图路径中大量跨边相互作用便可能需要更丰富边界状态。整数和必须防溢出,否则补值查询会产生伪匹配。

2n/2 仍是指数,n=80 已意味着约 240 个半状态。MITM 是精确指数算法的时间—空间折中,不是多项式算法。

推论与应用

Meet-in-the-Middle 适合 subset sum、knapsack、密码分析和若干小规模精确搜索,核心条件是跨半兼容性可由紧凑状态快速判定。Schroeppel–Shamir 等方法还能以惰性生成降低空间,但仍保留指数时间与更复杂的生成顺序不变量。

参考资料
  • Horowitz, Sahni, “Computing Partitions with Applications to Knapsack,” JACM, 1974.
  • Richard Schroeppel and Adi Shamir, “A T=O(2n/2), S=O(2n/4) Algorithm for Certain NP-Complete Problems”, SIAM Journal on Computing 10(3), 1981, pp. 456–464,原技术报告。
  • Jesper Nederlof and Karol Węgrzycki, Improving Schroeppel and Shamir’s Algorithm for Subset Sum via Orthogonal Vectors, 2021,作者稿,Appendix A,Lemma 3.3 的证明与 Lemma A.1:按堆惰性生成和列表及四列表匹配。
关系图谱4 个相邻概念 · 2 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
类型化关系