這個問題被問近日在接受採訪使用C++ priority_queue比較正確
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);
}
這是我用
1以下辦法)創建最大堆priority_queue存儲最近點 priority_queue<Point,vector<Point>,comp> pq;
2)迭代點向量並推送一個點,如果優先級隊列大小爲< m
3)如果尺寸==米然後比較隊列頂部與當前點和彈出如果必要
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)最後把優先級隊列中的內容在載體並返回。
我應該如何編寫comp和compareDistance比較器,以便我可以最初存儲m個點,然後將當前點與頂部點進行比較?
分享一個想法。我們可以使用像四元樹或者網格這樣的空間劃分。因此當中心發生變化時,我們不需要度假點或者重建priority_queue。 –
爲什麼你需要優先隊列? 1.測量到所有點的距離。存儲距離點(或點索引)到一個矢量,2 partial_sort這個矢量3.複製結果 – Alexander
'public interface ...'你確定它是C++嗎? – moooeeeep