Tôi có một nhóm đối tượng và tôi cần nhóm các thực thể này thành các nhóm có tên là specie
. Các thiết lập của tất cả các loài được xác định cuộc gọi Universe
và một thực thể phải thuộc về một và chỉ có một specie. Đối với điều này tôi có một hàm boolean intransitive gọi là f
trả về nếu hai thực thể, thông qua các tham số, tương thích. Một số specie
được xác định bởi một nhóm các thực thể tương thích với nhau và universe
được định nghĩa bởi một nhóm các loài không hoàn toàn tương thích với nhau, giả định rằng khả năng tương thích của hai loài được xác định bởi tính tương thích của tất cả các thực thể của nó.Thuật toán để tìm nhóm tối ưu các thành phần tương thích
Làm cách nào để xác định vũ trụ chứa số lượng loài nhỏ nhất có thể cho một nhóm thực thể nhất định?
Tôi đã thử như sau và hàm của tôi trả về một vũ trụ hợp lệ nhưng không phải là vũ trụ có số lượng loài nhỏ nhất có thể.
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: Số ít loài là loài. Specie là một từ hoàn toàn khác. – ciamej
Thật không may, giải pháp của bạn là 'O (n^3)' và của tôi là 'O (n^4)'. Nếu hiệu suất là một vấn đề đối với bạn, tôi có thể nghĩ cách nhanh hơn để tính toán nó. – ciamej
Bạn có thể cung cấp đầu vào là gì và đầu ra là gì. Và điều phức tạp là gì. – codebusta