내가 감독하는 학생들에게 다음 운동이 전달되었습니다.
평면에 점이 주어지면 , 모든 점 쌍 중 거리가 최소 인 한 쌍의 점을 찾는 알고리즘을 고안하십시오. 알고리즘은 시간에 실행되어야합니다 .o ( n 2 )
시간 의 작업을 해결하는 (상대적으로) 간단한 나누기 및 정복 알고리즘이 있습니다.
질문 1 : 최악의 시간 에서 주어진 문제를 정확하게 해결하는 알고리즘이 있습니까?
이것이 가능할 것으로 의심되는 것은 몇 가지 이야기에서 본 기억 (결과는 감사합니다)입니다. 그것은 그하게 일정 수 이상의 라인을 따라 무언가 바와 어떤 점 주위면에 배치 될 수있는 점을 반경의 원 안에 와 관련된 두 지점 사이의 최소 거리 나는 이라고 생각 합니다. 점 은 중심에 가 있는 등변 육각형을 형성합니다 (극단 한 경우). p r ∈ R r c = 7 p
이 경우 다음 알고리즘은 단계로 문제를 해결해야 합니다.
fun mindist [] | p::[] = INFINITY
| mindist p1::p1::[] = dist(P[0], P[1])
| mindist p::r = let m = mindist(r) in
min(m, nextNeighbour(p, r, m))
end
점에서 단지 일정 수 있기 때문에 이것은 선형 시간 (주장)되어 있습니다 r
에는보다 더 멀리 떨어져있을 수있는 m
발 p
(문 위 가정); 새로운 최소값을 찾기 위해서는 이러한 점만 조사하면됩니다. 물론 캐치가 있습니다. 어떻게 구현합니까 nextNeighbour
(선형 시간의 전처리로)?
질문 2 : 점 과 점 의 집합을 보자 . 하자 로를P ∉ R m ∈ R
과
.
이 유한 가정합니다 . in (amortised) 시간 에서 최소 거리로 을 찾을 수 있습니까? ( 조사 된 포인트 하나씩 추가하여 을 구성 한다고 가정 할 수 있습니다 .)