Hallo,
es geht darum, Punkte aus Punktwolken (Clustern) zu entfernen, wobei in jeder Wolke (Cluster) jeweils ein Punkt bleiben soll - was aufgrund der vielen verschachtelten Schleifen aber manchmal bis zu 5 Sekunden dauert...
Gibt es viell eine Möglichkeit, den Algo zu optimieren?
Vielen Dank für jeden Hinweis.
Konkret in Verdacht habe ich die TreeMap und den wiederholten MergedClusters-Aufruf:
es geht darum, Punkte aus Punktwolken (Clustern) zu entfernen, wobei in jeder Wolke (Cluster) jeweils ein Punkt bleiben soll - was aufgrund der vielen verschachtelten Schleifen aber manchmal bis zu 5 Sekunden dauert...
Gibt es viell eine Möglichkeit, den Algo zu optimieren?
Vielen Dank für jeden Hinweis.
Konkret in Verdacht habe ich die TreeMap und den wiederholten MergedClusters-Aufruf:
Java:
private static boolean removePointsFromDatabase(TreeMap<Point2D, Info> mergedClusters) {
if (mergedClusters.size() <= maxClusteredPoints1) {
return false;
}
// Start points removal logic
int mergedSize = mergedClusters.size();
TreeMap<Integer, LinkedList<Map.Entry<Point2D, Info>>> ranking =
new TreeMap<>(Comparator.reverseOrder());
for (Map.Entry<Point2D, Info> entry : mergedClusters.entrySet()) {
int neighboursCount = getNeighboursCount(mergedClusters, entry.getKey());
ranking.putIfAbsent(neighboursCount, new LinkedList<>());
ranking.get(neighboursCount).add(entry);
}
a:
for (Map.Entry<Integer, LinkedList<Map.Entry<Point2D, Info>>> entry1 : ranking.entrySet()) {
for (Map.Entry<Point2D, Info> entry2 : entry1.getValue()) {
TreeMap<Double, LinkedList<String>> ranking2 = new TreeMap<>();
for (Map.Entry<String, Info> entry3 : database.entrySet()) {
double d = distanceInKm(entry2.getKey(), entry3.getValue().getPoint());
if (d < minDistanceForClustering2) {
ranking2.putIfAbsent(d, new LinkedList<>());
ranking2.get(d).add(entry3.getKey());
}
}
if (ranking2.size() >= 2) {
ranking2.values().stream().skip(1).forEach(entry4 -> entry4.forEach(database::remove));
mergedSize = getMergedClusters().size();
if (mergedSize <= maxClusteredPoints2) {
break a;
}
}
}
}
int originalSize = database.size();
int diffSize = originalSize - mergedSize;
System.out.println("originalSize = " + originalSize);
System.out.println("mergedSize = " + mergedSize);
System.out.println("diffSize = " + diffSize);
return true;
}