algorithm - 如何通过和枚举集合的所有 k 组合?

标签 algorithm combinatorics

假设我有一组大小为 n 的有限数值。

问题:是否有一种有效的算法来枚举该集合的 k 个组合,以便当 I 中元素的总和小于或等于组合 I 的总和时,组合 I 优先于组合 J J 中的元素?


显然,可以简单地枚举组合并根据它们的总和对它们进行排序。然而,如果集合很大,则无法对所有组合进行暴力枚举,更不用说排序了。如果我只对获得按总和排名的前 m << select(n,k) 组合感兴趣,是否有可能在宇宙热寂之前获得它们?

最佳答案

没有多项式算法可以用这种方式枚举集合(除非 P=NP )。

如果有这样一个算法(设其为A),那么我们可以解决subset sum problem多项式:

  1. 运行A
  2. 进行二分搜索以查找总和最接近所需数字的子集。

请注意,第 1 步按多项式运行(假设),第 2 步按 O(log(2^n)) = O(n) 运行。

结论:由于子集和问题是 NP-Complete ,有效地解决这个问题将证明 P=NP - 因此这个问题没有已知的多项式解。


编辑:即使问题是 NP-Hard,获取“最小”m 子集也可以在 O(n+2^m) 上完成 通过选择最小的 m 元素,从这些 m 元素生成所有子集 - 并选择其中最小的 m 元素。因此,对于相当小的 m 值 - 计算它可能是可行的。

关于algorithm - 如何通过和枚举集合的所有 k 组合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13675212/

相关文章:

python - 高效的项目装箱算法(itertools/numpy)

javascript - "too much recursion"具有重复的变化

ruby-on-rails - 数组的所有变体

algorithm - 数组操作(需要最少的删除)

algorithm - 在 CUDA 代码中表示粒子的最佳方式

c++ - 如何将 13 位值映射到 4 位代码?

c# - 如何使用 DTW 算法实现修剪策略?

algorithm - O(1) 时间复杂度的以下 ncr 系列的总和

algorithm - 如何打印出给定电话号码可以代表的所有可能的字母组合?

algorithm - 总和是一个巨大的 float 的子集总和