また、指定された解像度内で距離を自動的にソートする "HashMapのような"配列を利用するO(N)の複雑さでこのアルゴリズムを使用することもできます。
アイデアは都市のリストをループにある
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);
}
は、関心の座標との距離を計算し、次にどこの都市がすべきかを決定するために距離を使用します。ここでは
は、Javaでの擬似コードです"HashMapのような"配列
cityDistances
に追加することができます。距離が小さいほど、インデックスは0に近くなります。
resolution
が小さいほど、リスト
closestCities
は最後のループ後に10都市になる可能性が高くなります。
あなたの面接官は正しいと思います。 – RBarryYoung
kが固定数である場合、yesはO(n)です。もしkがパラメータであれば、O(n * k) –
です。トップkの答えを追跡するためのさまざまなアプローチについては、http:// stackoverflowを参照してください。com/questions/19227698/write-a-program-to-find-100-largest-numbers-of- – mcdowella