将集合的分区枚举为相等大小的子集

时间:2014-02-28 02:30:49

标签: r algorithm matlab

我有一个集合,我想将其分区为包含相同数量元素的子集。

我正在寻找一种快速算法,最好不是启发式算法。

提示:

if  n= number of elements in the main set
    l= number of elements in each subset 

强力算法是:

  

1-x< - 所有n个事物的组合,每次没有   重复。 | X |!= NCL = N /(!升*(N-1))
  2-y< -All   x个事物的组合,每次都没有重复。 | Y | = XCN

     

3 - 选择y中的子集,例如其中没有任何重叠   元件。

答案数量为:

n!/(l!^(n/l)*(n/l)!)

例如,如果需要S={a,b,c,d},并且需要具有2个元素的子集到分区集S:

集x是:

   (a,b),(a,c),(a,d),(b,c),(b,d),(c,d)

集合y(潜在答案)是:

{(a,b),(a,c)}
{(a,b),(a,d)}
{(a,b),(b,c)}
{(a,b),(b,d)}
{(a,b),(c,d)}       
{(a,c),(a,d)}
{(a,c),(b,c)}
{(a,c),(b,d)}
{(a,c),(c,d)}
{(a,d),(b,c)}   
{(a,d),(b,d)} 
{(a,d),(c,d)}   
{(b,c),(d,d)}   
{(b,c),(c,d)}   
{(b,d),(c,d)}   

正确的答案是:

S1={(a,b),(c,d)}
S2={(a,c),(b,d)}
S3={(a,d),(b,c)}

只有当n很小时,所提到的算法才有用。 例如:

 n=90, l=3 =>
|x|=117480 
|y|=1.28827732e+318
and the number of correct answers is `2.533601e+82`.

因此,由于时间性能和内存问题,该算法在大多数情况下都不实用。

即使拥有并运行有效的算法也会非常耗时,因为结果数量很多。例如,在上述问题中,答案数= 2.533601e+82

我不是集合论的专家,所以也许这是一个众所周知的问题。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我认为这可能很接近......希望你使用java

public static void main(String[] args) {
   ArrayList<String> tokens = new ArrayList(new TreeSet<>(Arrays.asList(new String[]{"a","b","c","d"})));

    for (int i = 0; i < tokens.size(); i++) {
      String tokenA = tokens.get(i);
      for (int x = (i + 1); x < tokens.size(); x++) {
        String tokenB = tokens.get(x);
        //String tokenC = tokens.get(x + 1);

        System.out.println(tokenA + "-" + tokenB);
      }
    }
  }

我的输出是

run:
a-b
a-c
a-d
b-c
b-d
c-d
BUILD SUCCESSFUL (total time: 0 seconds)