는 평면의 점 집합입니다. 임의의 점 x ∉ S 는 동일한 평면에 제공됩니다. 이 작업은 모든 y ∈ S 를 x 와 y 사이의 유클리드 거리로 정렬하는 것입니다.
두뇌없는 접근법은 모든 y ∈ S에 대해 와 y 사이의 거리를 계산 한 다음 빠른 알고리즘을 사용하여 정렬하는 것입니다.
정렬 프로세스가 빨라지도록 를 저장하거나 전처리 하는 방법이 있습니까?
는 평면의 점 집합입니다. 임의의 점 x ∉ S 는 동일한 평면에 제공됩니다. 이 작업은 모든 y ∈ S 를 x 와 y 사이의 유클리드 거리로 정렬하는 것입니다.
두뇌없는 접근법은 모든 y ∈ S에 대해 와 y 사이의 거리를 계산 한 다음 빠른 알고리즘을 사용하여 정렬하는 것입니다.
정렬 프로세스가 빨라지도록 를 저장하거나 전처리 하는 방법이 있습니까?
답변:
해결 방법 1 : 한 쌍의 점 사이 에서 수직 이등분선을 찾아이 선들의 배열을 구성합니다. 배열은 Θ ( n 4 ) 셀을 가지며 , 정렬 순서는 일정하다. 따라서 배열을위한 점 위치 데이터 구조를 구축하고 해당 셀 내의 점에 대해 반환되는 정렬 된 순서로 각 셀을 장식하십시오. 인접한 셀 사이의 정렬 순서는 단일 조옮김에서만 다르므로 영구 데이터 구조를 사용하여 이러한 정렬 순서의 표현이 공간을 공유 할 수 있습니다. 총 공간은 O ( n 4 ) 이고 쿼리 시간은 O입니다. .
해결 방법 2 : 이 같은 수직 이등분선 의 의 무작위 표본을 선택하고 , 배열을 구성하고, 두 표본 선의 각 교차를 통해 각 배열 셀을 수직선 세그먼트로 분할합니다. 생성 된 구획은 Θ ( n 2 ) 셀을 가지며, 각각의 확률은 O ( n ) 샘플링되지 않은 이등분선에 의해 교차된다 . 셀 내의 일부 x에서 볼 때 포인트의 유효한 정렬 순서에 따라 파티션의 각 셀을 장식하십시오. 총 공간은 O ( n 3 ) 입니다.
이제 쿼리를 수행하려면 파티션에서 쿼리 지점을 찾고 파티션 셀과 함께 저장된 순서 를 찾은 다음이 저장된 순서로 시작하여 Levcopoulos & Petersson (1989) 의 데카르트 트리 비교 정렬 알고리즘을 사용하십시오 . 이 단계의 시간은 비례합니다. 여기서 k i 는 점 y i 와 순서가 다른 점의 수 입니다. 그러나 ∑ k i 는 O ( n ) (각 샘플링되지 않은 이등분선은 최대 하나의 비 순차적 쌍 쌍을 야기 함)이므로 쿼리 시간 또한 O ( N ) .
당신은 아마 당신이 그것을 슬라이스하는 방법으로 시간 에서 벗어날 수 없을 것입니다; 모든 가능한 정렬 순서에 해당하는 사전 계산 영역조차도 O ( n ! ) 영역을 생성 할 수 있으므로 의미있는 검색 기술로 '귀하의'영역을 찾는 데 O ( log ( n ! ) ) = O ( n log ( n ) ) 시간. ( 편집 :이것은 절대적으로 잘못입니다. 한 번에 전체 분류가 필요하지 않습니다 특히 있지만 단지 무작위로 뽑아 수 있어야합니다 -!) 자세한 정보는 다른 한편으로는 복잡성 다운 받고 하나의 유용한 방법을 데이빗 엡스타인의 훌륭한 대답을 참조 TH-가까운 즉석에서 가장 가까운 이웃뿐만 아니라 두 번째 가장 가까운 곳까지 수용하는 표준 Voronoi 셀의 확장 인 고차 Voronoi 다이어그램을 통해 발생할 수 있습니다. k-nearest 이웃 검색에 대한 Frank Dehne의 논문, http : //people.scs .carleton.ca / ~ dehne / publications / 2-02.pdf 는 표준 참조 인 것 같습니다. 그의 홈페이지 ( http://www.dehne.carleton.ca/publications) 에는 보로 노이 다이어그램에 대한 다른 많은 논문들이 있습니다.