我有一个集合,我想将其分区为包含相同数量元素的子集。
我正在寻找一种快速算法,最好不是启发式算法。
提示:
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 | = XCN3 - 选择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
我不是集合论的专家,所以也许这是一个众所周知的问题。
感谢您的帮助。
答案 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)