【问题标题】:All subsets of size k, maximize difference between subsets所有大小为 k 的子集,最大化子集之间的差异
【发布时间】:2013-07-17 02:33:32
【问题描述】:

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

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

ABCD
    EFGH
AB    GH
  CDEF
AB  EF
  CD  GH

请注意,基集足够大,以至于在内存中保存 nCk 个项目是不切实际的。

【问题讨论】:

    标签: algorithm combinatorics


    【解决方案1】:

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

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

    我很满意这也适用于其他几个小案例,现在期待反例和反对票。

    啊,所以您不想依赖首先构建按字典顺序排列的子集集。我最初的想法是让 2 个子集生成器同时运行,一个从第一个子集 (eg AB) 开始,另一个从最后一个子集开始 (eg CD) 然后倒退。如果你明白我的意思。

    【讨论】:

    • 你让我意识到我错误地表述了这个问题。请参阅编辑。 (只有比我在示例中的集合更大时,差异才会变得明显。您的解决方案在集合 n 和集合 n + 2 之间没有提供足够大的间隙。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-20
    • 2015-03-13
    • 1970-01-01
    • 2017-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多