質問はいくつかの方法で読むことができます。多数のポイントがあり、座標ペアとして指定された任意のポイントで繰り返しプローブし、nを事前に固定して、プローブに最も近いn個のポイントを取得することを意味すると解釈します。(原則として、nが変化する場合、可能なn ごとにデータ構造を設定し、各プローブでO(1)時間で選択できます。これには非常に長いセットアップ時間がかかり、大量のRAMが必要になる可能性がありますが、そのような懸念を無視するように言われます。)
すべての点の次数nのボロノイ図を作成します。これにより、プレーンが接続された領域に分割され、各領域には同じn近傍があります。これにより、状況がポリゴン内の問題になり、多くの効率的な解決策があります。
ボロノイ図にベクトルデータ構造を使用すると、ポイントインポリゴン検索にはO(log(n))時間かかります。実際には、ダイアグラムのラスターバージョンを作成するだけで、このO(1)を非常に小さな暗黙の係数で作成できます。ラスター内のセルの値は、(i)n個の最も近いポイントのリストへのポインター、または(ii)このセルがダイアグラム内の2つ以上の領域にまたがることを示します。(x、y)の任意の点のテストは次のようになります。
Fetch the cell value for (x,y).
If the value is a list of points, return it.
Else apply a vector point-in-polygon algorithm to (x,y).
O(1)のパフォーマンスを実現するには、ラスタメッシュが十分に細かくなければ、複数のボロノイ領域にまたがるセルに比較的少数のプローブポイントが落ちます。これはいつでも達成できますが、グリッドのストレージに多大な費用がかかる可能性があります。