用于在任意长度集内找到可变长度子集的组合的算法

时间:2015-04-08 18:57:34

标签: algorithm set

我试图找出一个方法,它会返回一个集合中所有子集组合的列表。方法调用看起来像getSubsets(7, 3)基于下面的图像,返回的输出我需要的是以下形式和顺序:

123
124
125
126
127
134
135
136
137
145

......等等

下图显示完全计数顺序应该如何。我一直在这个上敲头一天都找不到合适的解决方案。 TIA。

set of 7 with all 3 length subsets

2 个答案:

答案 0 :(得分:1)

获取给定子集后的下一个子集:

  1. 查找子集中其后继者不在子集中的最大元素。
  2. 删除该元素以及子集中的所有较大元素。
  3. 从后继元素开始,添加连续元素,直到子集的大小正确。
  4. 如果步骤1失败,则列举了所有可能的子集。

    在C:

    bool next_subset(int* subset, int n, int k) {
      // subset is a vector of k ints in the range [0, n)
      int i, j;
      for (i = k - 1, j = n - 1; subset[i] == j; --i, --j) {
        if (i == 0)
          return false; // No more subsets
      }
      for (j = subset[i] + 1; i < k ; ++i, ++j) {
        subset[i] = j;
      }
      return true;
    }  
    

答案 1 :(得分:0)

如果事先知道m getSubsets(n, m),则代码只是嵌套for循环;例如。在Mathematica:

With[{n = 7},
 Table[{i, j, k},
   {i, n - 2}, {j, i + 1, n - 1}, {k, j + 1, n}]]

这将按照您想要的顺序生成所有3个子集,n为参数。当然,如果m不是3,则代码无用,特定m需要特定代码。这就是为什么我赞成@rici灵活的方法,它对一般m有效。