You need to enable JavaScript to run this app. 最大化组大小平方和的集合分组问题高效解法
优惠活动
大模型
产品
解决方案
定价
更多

最大化组大小平方和的集合分组问题高效解法

集合分组最大化并集大小平方和的高效求解思路

问题核心约束拆解

  • 目标本质:从N个最多含M个元素的集合中,选出若干不相交的子集,每个子集大小为2/3/4(对应2元组/3元组/4元组),最大化所有组的元素并集大小的平方和。
  • 数量上限:最多选n2个2元组、n3个3元组、n4个4元组,集合可任意跳过,无强制全部分配要求。
  • 规模限制:1<=N<=1e5,1<=M<=1e6,0<=n2,n3,n4<=5e4,常规暴力、逐集合DP的方案完全无法适配规模要求。

这里要提平方函数的核心性质:同等总元素覆盖量下,组的规模越大,平方和收益越高。比如两个大小为3的组总平方和为9+9=18,对应大小为6的单组平方和为36,收益差距接近一倍,这决定了高价值分组一定是优先匹配重叠度高、合并后增量元素少的集合组合。你给出的示例中,{4,5,6}与{6,7}组成的2元组价值为16,远高于{4,5,6}与同元素重复集合组成的2元组价值9,会被优先匹配,后续升级匹配得到3元组的49价值,最终合计65的结果与最优解完全一致。

原有思路的失效原因

  • 逐集合分配组号的方案:分组的收益是组内集合的联合属性,无法通过逐集合的局部决策计算,复杂度会随着分组数量上涨呈阶乘级增长。
  • 逐集合维护DP的方案:原设计的dp[i][j]需要存储前i个集合的全部分组结果,状态空间为O(N*总组数),不仅存储成本超出内存限制,转移时还要枚举所有组内组合,完全无法适配1e5的N规模。

高效方案的实现路径

第一步:预筛候选组合,避免全量枚举

  • 用带整数ID的稀疏哈希存储每个集合的元素,无需维护全量位图。
  • 用MinHash方法快速计算集合间的相似度,仅保留相似度超过阈值的集合对作为候选,彻底跳过无价值的低相似度组合,将候选对的规模从N²级压缩到O(N)级,为后续计算降本。
  • 两个集合的并集大小无需全量遍历计算:仅需遍历较小集合的元素,统计在较大集合中已存在的元素数量,即可快速算出并集大小。

第二步:最大堆增量式贪心匹配(核心降维逻辑)

利用平方收益的边际递增性质,按收益从高到低匹配分组,全程仅处理有效候选,无全量状态存储成本:

  1. 初始化最大堆:将所有预筛得到的2元组候选,按|A∪B|²的价值从大到小存入堆中。
  2. 迭代弹出堆顶元素:
    • 校验候选组有效性:如果组内包含的集合已被其他分组占用,或组类型已达到对应数量上限,直接跳过该候选。
    • 校验通过则正式选用该分组:累计收益,标记组内所有集合为已占用状态。
    • 增量生成更高阶的组候选:
      • 如果当前选中的是2元组,将该2元组与所有相似度达标的未占用集合结合,计算形成3元组的并集大小与对应价值,存入堆中。
      • 如果当前选中的是3元组,将该3元组与所有相似度达标的未占用集合结合,计算形成4元组的并集大小与对应价值,存入堆中。
  3. 直到堆中无有效候选为止,即可得到近似全局最优的结果。

该方法的时间复杂度为O(N log N),完全适配1e5的N规模;由于优先匹配高价值组合,且支持从2元组到3元组、4元组的升级式匹配,在目标为最大化平方和的场景下,与全局最优结果的偏差极小。

第三步:DP思路的优化方向

如果需要追求严格全局最优,可将原有的逐集合DP状态做降维改造:

  • 放弃“遍历前i个集合”的状态维度,改为以“已使用的2元组、3元组、4元组额度”为状态,即dp[x][y][z]表示使用x个2元组、y个3元组、z个4元组时能拿到的最大平方和。
  • 状态边界天然受集合总数约束:所有状态满足2x + 3y +4z <= N,实际状态数远低于n2n3n4的理论值,结合预筛得到的候选组价值做转移,可将空间复杂度压到O(N)级别。
  • 转移逻辑简化:每次转移仅考虑选一个有效候选组的情况,无需枚举组内集合的排列顺序。

内容的提问来源于stack exchange,提问作者Mr Sukhe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.02 22:24:03