【发布时间】:2015-11-04 17:20:10
【问题描述】:
我有一组实体,我需要将这些实体分组到称为specie 的组中。定义的所有物种集合调用Universe,并且一个实体必须属于一个且仅属于一个物种。为此,我有一个名为f 的布尔不传递函数,如果通过参数传递的两个实体兼容,则返回该函数。 specie 由一组相互兼容的实体定义,universe 由一组彼此不完全兼容的物种定义,假设两个物种的相容性由所有物种的相容性定义它的实体。
对于给定的一组实体,我如何确定包含尽可能少的物种的宇宙?
我尝试如下,我的函数返回一个有效的宇宙,但不是物种数量可能最少的那个。
public class Specie {
private List<Entity> individuals;
public Specie() {
this.individuals = new ArrayList<>();
}
public boolean matches(Entity e) {
for (Entity s : this.individuals) {
if (!f(s, e)) {
return false;
}
}
return true;
}
public void add(Entity i) {
this.individuals.add(i);
}
}
private static int numberOfSpeciesRecursive(List<Entity> entities, List<Specie> universe) {
if (entities.size() == 0) {
return 0;
} else {
List<Entity> remains = new ArrayList<>();
Specie specie = new Specie();
for (Entity e : entities) {
if (specie.matches(e)) {
specie.add(e);
} else {
remains.add(e);
}
}
universe.add(specie);
return 1 + numberOfSpeciesRecursive(remains, universe);
}
}
【问题讨论】:
-
顺便说一句:物种的单数就是物种。 Specie 是一个完全不同的词。
-
不幸的是,您的解决方案是
O(n^3),而我的解决方案是O(n^4)。如果性能对您来说是个问题,我可能会想到一种更快的计算方法。 -
你能提供什么是输入,什么是输出。复杂性应该是多少。
-
不幸的是,我的解决方案是错误的。看来这个问题比我还难。我认为它是 NP 难的,所以唯一可能的精确算法将是指数的......
标签: java algorithm grouping combinations combinatorics