この質問はインタビューで頼まれたPRIORITY_QUEUEコンパレータは最近使用してC++正しく
public interface PointsOnAPlane {
/**
* Stores a given point in an internal data structure
*/
void addPoint(Point point);
/**
* For given 'center' point returns a subset of 'm' stored points that are
* closer to the center than others.
*
* E.g. Stored: (0, 1) (0, 2) (0, 3) (0, 4) (0, 5)
*
* findNearest(new Point(0, 0), 3) -> (0, 1), (0, 2), (0, 3)
*/
vector<Point> findNearest(vector<Point> points, Point center, int m);
}
私は を使用この従っているアプローチは)最も近いポイントを保存するために、最大ヒープPRIORITY_QUEUEを作成 priority_queue<Point,vector<Point>,comp> pq;
2)ポイントベクトルを反復し、優先キューサイズが<の場合はポイントをプッシュします。
3)サイズ== mが現在ポイントとキューのトップを比較し
必要for(int i=0;i<points.size();i++)
{
if(pq.size() < m)
{
pq.push(points[i]);
}
else
{
if(compareDistance(points[i],pq.top(),center))
{
pq.pop();
pq.push(points[i]);
}
}
}
4)最後に、ベクターにプライオリティキューの内容を入れて返す場合ポップ場合。
コンパレータとcompareDistanceコンパレータを使って最初にm点を保存し、現在の点と上の点を比較する方法を教えてください。
アイデアを共有してください。Quadruple treeやGridのような空間分割を使うことができます。中心が変更されたら、リゾートポイントや再構築priority_queueは必要ありません。 –
なぜ優先キューが必要ですか?すべての点までの距離を測定する。ベクトルに距離点(または点インデックス)を格納する。2 partial_sort this vector 3.結果をコピーする。 – Alexander
'public interface ...'確かにC++? – moooeeeep