이 질문은 여러 가지 방법으로 읽을 수 있습니다. 나는 당신이 많은 수의 포인트를 가지고 있고 좌표 쌍으로 주어진 임의의 포인트로 반복적으로 포인트를 프로브하고 n을 미리 고정하여 프로브에 가장 가까운 n 포인트를 얻으려고한다고 해석합니다. (기본적으로 n이 다를 경우 가능한 모든 n에 대한 데이터 구조를 설정하고 각 프로브와 함께 O (1) 시간에 선택할 수 있습니다. 설정 시간이 오래 걸리고 많은 RAM이 필요합니다. 그러한 우려를 무시하라는 지시를받습니다.)
모든 포인트 의 order-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) 성능을 달성하려면 래스터 메쉬는 여러 보로 노이 영역을 가로 지르는 셀에 상대적으로 적은 프로브 포인트가 떨어질 정도로 충분히 미세해야합니다. 그리드 저장 비용이 많이 들기 때문에 항상이 작업을 수행 할 수 있습니다.