У меня есть набор объектов, и мне нужно сгруппировать эти объекты в группах с именем specie
. Набор всех видов определяет вызовы Universe
, и сущность должна принадлежать одному и только одному экземпляру. Для этого у меня есть логическая непереходная функция, называемая f
, которая возвращает, если два объекта, переданные параметрами, совместимы. A 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);
}
}
btw: Особый вид видов. Specie - совершенно другое слово. – ciamej
К сожалению, ваше решение - 'O (n^3)', а my - 'O (n^4)'. Если производительность для вас является проблемой, я могу подумать о более быстром способе ее вычисления. – ciamej
Можете ли вы указать, что такое ввод и какой результат. И какая должна быть сложность. – codebusta