최근접 점쌍 문제

최근접 점쌍 문제는 주어진 점 배열에서 가장 가까운 두 점을 찾는 알고리즘이다. 이 알고리즘은 문제 해결을 위해 분할 정복(Divide and Conquer) 방법론을 사용하며, O(nlogn)의 복잡도로 정확한 해를 구한다.

주어진 점들 중 빨간색 두 점을 찾아야 한다

위 이미지에서 볼 수 있듯이, 점 배열이 주어졌을 때 가장 가까운 두 점을 찾아야 한다. 하지만 모든 점 쌍을 비교하는 O(n^2) 복잡도의 방법을 사용하지 않고 어떻게 이를 해결할 수 있을까?

이 문제를 해결하기 위한 주요 알고리즘 단계는 다음과 같다.

var innerPoints = mergeSort(points, sortAccording : true)
let line:Double = (p[mid].x + p[mid+1].x)/2
var strip = [Point]()   
var i=0, j = 0
while i<n
{
	if abs(p[i].x - line) < min
	{
		strip.append(p[i])
		j+=1
	}
	i+=1
}

스트립에 있는 4개의 점

while i<j
    {
        x = i+1
        while x < j
        {
            if (abs(strip[x].y - strip[i].y)) > min { break }
            if dist(strip[i], strip[x]) < temp
            {
                temp = dist(strip[i], strip[x])
                tempFirst = strip[i]
                tempSecond = strip[x]
            }
            x+=1
        }
        i+=1
    }

이것이 최근접 점쌍 알고리즘의 작동 방식이다. 이 알고리즘은 정렬을 통해 O(nlogn)의 복잡도를 달성하며, 다양한 수학적 기법을 사용해 최적화한다.

함께 보기

알고리즘 구현을 직접 실습해 볼 수 있는 플레이그라운드를 확인해 보세요.

Wikipedia

Swift Algorithm Club을 위해 Ahmed Nader가 작성함