Ayrıca, bu algoritmayı, belirli bir çözünürlük içinde mesafeleri otomatik olarak sıralayabilecek bir "HashMap benzeri" dizi kullanan O (N) karmaşıklığı ile de kullanabilirsiniz.
Fikir şehirler listesinde döngü olduğunu
City[] cities = //your city list
Coordinate coor = //the coordinate of interest
double resolution = 0.1, capacity = 1000;
ArrayList<City>[] cityDistances = new ArrayList<City>[(int)(capacity/resolution)];
ArrayList<City> closestCities = new ArrayList<City>();
for(City c : cities) {
double distance = coor.getDistance(c);
int hash = distance/resolution;
if(cityDistances[hash] == null) cityDistances[hash] = new ArrayList<City>();
cityDistances[hash].add(c);
}
for(int index = 0 ; closestCities.size() < 10 ; index++) {
ArrayList<City> cList = cityDist[index];
if(cList == null) continue;
closestCities.addAll(cList);
}
ilgi koordinat ile mesafeyi hesaplamak ve sonra nerede kent gereken belirlemek için mesafeyi kullanın: Burada
Java sözde kod "HashMap-like" dizisine
cityDistances
eklenir. Uzaklık ne kadar küçük olursa, endeks 0'a yakın olacaktır.
resolution
ne kadar küçükse, son döngüden sonra 10 şehirle sonuçlanacaktır (
closestCities
).
Anketörünüzün doğru olduğunu düşünüyorum. – RBarryYoung
Eğer k sabit bir sayı ise, o zaman evet O'dur (n). Eğer k bir parametreyse o zaman O (n * k) –
olur. Top k cevaplarını takip etmek için bir dizi farklı yaklaşım için http: // stackoverflow'a bakınız.com/sorular/19227698/yazma-a-Program-to-bulmak-100-büyük-numaralar-out-of-an-dizisi-of-1-milyar-numaralar – mcdowella