所有大小为k的子集,最大化子集之间的差异

时间:2013-07-16 17:45:34

标签: algorithm combinatorics

用于枚举大小 k 的所有子集的库存算法(来自一组大小 N )(例如,如此处所述:generate all subsets of size k from a set)倾向于使用“词典”顺序,其中最左边的元素变化最慢。我还发现了一种算法,可以最小化枚举中连续子集之间的差异,有点像Gray code

我希望在每个步骤生成一个与所有前面的子集最大不同的子集。 (与之前的问题表达式中的相同“连续子集之间的最大差异”。)例如,考虑一组大小为8的大小为4的子集,一个可接受的顺序开始

ABCD
    EFGH
AB    GH
  CDEF
AB  EF
  CD  GH

请注意,基本集足够大,以至于在内存中保存 n C k 项是不切实际的。

1 个答案:

答案 0 :(得分:1)

在您想要的输出中,不同子集的元素数量给出了序列2,1,2,1,2。通过从按字典顺序排列的子集列表中选择第一个,然后是最后一个,然后是第二个,然后是第二个, etc ,我得到相同的序列。在每个步骤中选择顺序中距离最远且尚未选择的子集。

我没有得到相同的子集序列,只是相同数量的差异序列。

我很满意自己,这也适用于其他一些小案例,我现在期待反例和低票。

啊,所以你不想首先依赖于构建按字典顺序排列的子集。我最初的想法是让2个子集生成器同时运行,一个从第一个子集开始(例如 AB)并继续前进,另一个从最后一个开始(例如 CD)并向后退。如果你理解我的意思。