我有一组实体需要分组,这些组称为“物种”。定义所有物种的集合称为“宇宙”,一个实体必须属于一个且仅属于一个物种。为此,我有一个名为“f”的布尔不传递函数,该函数返回传递的两个实体是否兼容。与彼此兼容的实体组成的组定义了一个“物种”,而被认为相互不完全兼容的物种组成了一个“宇宙”,假设两个物种的兼容性由所有实体的兼容性定义。
如何确定包含给定实体集的最小可能物种数量的宇宙?
我尝试过以下方法,我的函数返回一个有效的宇宙,但不是可能具有最小物种数的宇宙。
如何确定包含给定实体集的最小可能物种数量的宇宙?
我尝试过以下方法,我的函数返回一个有效的宇宙,但不是可能具有最小物种数的宇宙。
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);
}
}
O(n^3)
,而我的是O(n^4)
。如果性能对你来说是个问题,我可以考虑一种更快的计算方法。 - ciamej