这个问题可以通过几种方式来理解。我将其解释为意味着您拥有大量点,并且打算使用坐标对给出的任意点重复探测它们,并希望获得n个与探测点最接近的点,并预先固定n个点。(原则上,如果n会变化,则可以为每个可能的n 设置一个数据结构,并在每个探针的O(1)时间中选择它:这可能需要很长的设置时间,并且需要大量RAM,但是我们被告知忽略此类担忧。)
建立所有点的n阶Voronoi图。这将平面划分为相连的区域,每个区域具有相同的n个邻居。这将情况减少到多边形点问题,该问题具有许多有效的解决方案。
使用Voronoi图的矢量数据结构,多边形中点搜索将花费O(log(n))时间。出于实际目的,只需创建图表的栅格版本,即可使O(1)的隐式系数极小。栅格中像元的值要么是(i)指向n个最近点的列表的指针,要么是(ii)该像元跨过图中两个或多个区域的指示。在(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)性能,栅格网格必须足够精细,以使相对较少的探测点落入跨越多个Voronoi区域的像元中。这总是可以实现的,而且可能会为网格存储付出巨大的代价。