Questo sarà lento.
Sembra che l'operazione add
richiederà eventualmente O(N)
, dove N
è il numero di città esistenti nella raccolta. Questo sarà più lento e lento con l'aggiunta di più città.
Non riesco a pensare a un modo pigro per valutare la distanza. Mi sembra che le distanze all-pair debbano essere calcolate in anticipo. Forse qualcuno può offrire suggerimenti migliori.
Commento. SortedMap
Sembra sbagliato. Non consente chiavi duplicate (due doubles
con lo stesso valore). Tuttavia, le possibilità di due coppie di città con la stessa distanza sembra remota per me ...
public class CityCollection
{
private List<City> cities;
// Cache distances when cities added, because expensive to calculate
private Map<Pair<City, City>, double> distances;
// sorted by pairwise distances
private SortedMap<double, Pair<City, City>> sortedByDistances;
public void add(City city)
{
if (cities.contains(city)) return;
for (City oldCity : cities)
{
Pair<City, City> pair = new Pair<City, City>(oldCity, city);
double distnace = getDistance(oldCity, city);
distances.put(pair, distance);
sortedByDistances.put(distance, pair);
}
cities.add(city);
}
// this is possibly very very slow, or very very fast...
public static double getDistance(City origin, City destination)
{
Query q = new Query(
origin.getCentroid().toString(),
destination.getCentroid().toString(),
"GreatCircle");
// .. wait for query to finish
return q.distance();
}
// implement your other methods here
}