将列表随机分组为N个子集,每个子​​集中包含K个元素

时间:2013-08-12 16:25:29

标签: java algorithm random

我有以下列表列表< List< Integer>>

1 2
3
4 5 6
7
8
9
10

我必须将这个列表列表随机分组为3个子集,每个子​​集有4个元素(从不在最后一个子集中我将少于4个元素),并且在每个子集中我都不能拥有来自同一行的元素(i例如,不能有3 4 5 7)。应该是什么基本算法????

3 个答案:

答案 0 :(得分:4)

  

什么应该是基本算法????

从列表列表中随机选择的前四个 1 中的每一个中取出四个随机元素。删除所选项目,然后重复下一个子集。随时删除空列表。

接下来,您需要注意并非所有输入都是可解决的:

1
2
3
4
5 6 7 8 9

在这种情况下,我们随机选择

1*
2*
3*
4
5 6 7 8 9*

- > 7 1 2 3(随机选择)

[]
[]
[]
4*
5 6 8 9*

- > 5 4。 。 < - 呃,即使非空列表仍然存在,也无法从不同的列表中选择四个项目。您可以在迭代期间检测到这一点。

1 :或者,如果剩下的非空列表少于四个,则从所有列表中随机选择。

答案 1 :(得分:0)

最简单的答案是执行随机选择,检查是否违反了“两个来自同一个”规则。如果是,那就扔掉再试一次。

答案 2 :(得分:0)

  1. 按元素数量对列表进行排序。

  2. 选择4个元素,每个元素中包含4个元素。

  3. 场。

  4. 从2开始重复。

  5. heap可以提供帮助。

    为什么我们需要从包含最多元素的列表中选择?

    考虑这种情况:

    1 2
    3 4
    5 6
    7
    8
    

    如果我们选择7和8,我们将留下类似的东西:

    1 2
    3
    5
    

    从这里开始,没有办法从不同的列表中选择4个元素。

    但是,如果我们从具有最多元素的列表中选择元素,我们将留下类似的内容:

    1
    3
    5
    8
    

    从这里我们可以从每个列表中选择一个元素。