최근접 점쌍 문제

위키백과, 우리 모두의 백과사전.

최근접 점쌍이 빨간색으로 표시되어있다.

최근접 점쌍 문제 (closest pair problem)계산기하학의 문제로서, 거리 공간상에 n 개의 점이 주어졌을 때, 사이의 거리가 가장 짧은 두 점을 찾아내는 문제이다.

가능한 모든 점쌍들의 거리를 비교해 최솟값을 찾는 알고리즘은 O(n2)의 시간을 요구한다. 하지만 유클리드 공간이나 정해진 d의 차원을 가지는 Lp 공간에서는 O(n log n)의 시간에 해결 될 수 있다.

완전 탐색 알고리즘[편집]

최근접 점쌍은 완전 탐색 알고리즘을 사용하면 O(n2)의 시간에 찾을 수 있다. 이를 위해서는 아래와 같이 개의 모든 쌍들 사이의 거리를 계산하여 그 중 가장 가까운 두 점을 고르면 된다.

minDist = infinity
for i = 1 to length(P) - 1
 for j = i + 1 to length(P)
  let p = P[i], q = P[j]
  if dist(p, q) < minDist:
   minDist = dist(p, q)
   closestPair = (p, q)
return closestPair

좌표 평면[편집]

점들이 좌표 평면에 주어질 경우, 이 문제는 다음과 같은 재귀적분할 정복 알고리즘으로 O(n log n)안에 해결할 수 있다.

  1. 점들을 x좌표에 따라 오름차순으로 정렬한다.
  2. 점들이 두개의 같은 크기의 집합으로 나뉘도록 수직선 을 기준으로 양옆으로 분할한다.
  3. 왼쪽과 오른쪽의 점들의 집합에 대해 재귀적으로 문제를 해결한다. 이것을 통해 왼쪽과 오른쪽에서의 최근접 거리인 을 찾을 수 있다.
  4. 하나의 점은 분할선 왼쪽에 존재하고, 다른 점은 분할선 오른쪽에 존재하는 쌍들 중 그 거리가 최소가 되는 쌍을 찾는다. 이것을 통해 을 찾을 수 있다.
  5. 최종적으로 찾고자 하는 최근접 거리는 중 가장 짧은 거리이다.
다른 점은 (d*2d)크기의 직사각형 안에 존재해야 한다.

4번째 단계를 해결할 때 가능한 모든 쌍들을 탐색 해 본다면, 역시 제곱에 비례하는 시간이 필요할 것이다. 하지만 점들이 분포되어있는 특별한 성질을 이용한다면, 선형적 시간안에 해결될 수 있다. 3번 단계를 통해서, 가장 가까운 두 점은 보다 더 멀리 떨어져 있을 수는 없음을 알 수 있다. 따라서 분할선 왼쪽에 있는 각각의 점 에 대해서, 좌표를 중심으로 하고 분할선 오른쪽에 존재하는 크기의 직사각형 내부에 존재하는 점들에 대해서만 거리를 계산해도 된다. 이 직사각형은 최대 6개까지의 점만을 포함하기 때문에, 최대 쌍의 점들에 대해서만 계산을 해도 충분히 최소 거리를 구할 수 있다. 이 알고리즘의 연산의 수행 횟수를 재귀식을 표현하면 으로 표현할 수 있으며, 마스터 정리에 따라 로 나타낼 수 있다.