읽고 나면 진짜 쉬워지는 자료 구조 - 9. 공간 트리

트리 기반 자료 구조와 공간 분할의 개념을 기반으로 최근접 이웃 탐색을 더 향상시키기

🔖 9.1 쿼드 트리

격자의 한계

  • 많은 격자 상자를 사용하면 상당한 메모리가 필요하고 많은 상자 탐색 필요

  • 격자를 거칠게(?) 분할하면 상자에 들어가는 점이 많아져 단순 선형 스캔과 비슷한 결과가 나타남

  • 이에 대해 데이터에 따라 공간을 동적으로 분할하면 좋음 -> 균일 쿼드 트리

균일 쿼드 트리

  • 트리의 분기 구조를 격자에 도입하며, 트리의 각 노드는 공간의 각 영역을 나타냄

  • 할당된 공간을 점점 더 작은 하위 영역으로 재귀적으로 분할하는 방식으로 미술처럼 쿼드 트리 만들기

  • 노드에 점을 추가하는 것은 새로운 점의 위치를 찾기 위해 트리를 탐색하는 것으로 이루어진다.

점 제거하기

  • 점을 삽입하는 것과 비슷하지만 더 복잡한 과정을 따른다.

  • 격자와 마찬가지로 임의로 가까운 점을 추가하거나 중복된 점을 삽입할 수 있다.

  • wrapper 함수는 점이 트리 경계 안에 있는지 확인 후, 재귀적인 제거 함수 호출

균일 쿼드 트리에 대한 탐색

  • 균일 쿼드 트리에서는 루트 노드에서 탐색을 시작한다.

  • 그리고 현재 후보보다 더 가까이 있는 점이 포함될 수 있는지를 먼저 확인한다.

  • 책에서 든 예시처럼, 게으른 이웃이 어디로 공을 던져야 가장 짧은 거리로 우리집 마당에 공을 넘겨줄 수 있는지 물어보는 것이다.

🔖 k-d 트리

k-d 트리의 구조

  • k-d 트리는 쿼드 트리와 비슷한 개념을 기반으로 구축된다.

  • 쿼드 트리의 공간 분할과 이진 탐색 트리의 2개 자식으로 뻗어나가는 특성을 결합해 두 자료 구조의 장점을 모두 취하는 공간 자료구조다.

  • k-d 트리는 한 차원을 선택해서 해당 차원을 기준으로 데이터를 분할한다.

  • 유연한 구조로 인해 노드의 공간 경계를 다룰 때는 더 주의해야 한다.

  • 복잡성으로 인해 각 k-d 트리 노드는 상당한 양의 정보를 저장한다.

꼭 들어맞는 공간 경계

  • 엄격한 경계를 사용하면 k-d 트리를 데이터에 더 잘 적용시킬 수 있다.

  • 엄격한 경계를 통해 얻은 영역이 훨씬 작기 때문에 가지치기를 더 강력하게 할 수 있다.

  • 따라서 목표점과 경계 사이의 최소 거리가 더 커질 가능성이 높다.

k-d 트리 만들기

  • 이진 탐색 트리 생성과 비슷한 재귀 과정을 거치지만 차이가 있다.

  • 처음에는 모든 데이터 점에서 시작하고, 분할할 차원과 값을 선택해 두 하위 집합으로 데이터 점들을 나눈다.

  • 중복 데이터가 있을 때 무한 재귀가 발생하는 것을 피하기 위해 마지막 두 검사 중 하나는 사용한다.

  • 주된 차이는 k-d 트리의 경우 각 레벨에서 분할할 차원을 하나만 선택한다는 것이다.

k-d 트리의 연산

  • 기본 연산은 점의 삽입, 제거, 탐색이며 쿼드 트리와 같은 방법을 쓴다.

  • 모든 연산은 맨 위에서 시작하고, 분할 값을 사용해 적절한 가지로 이동한다.

  • 주된 차이는 사분면 중 어느 쪽을 탐색할지 선택하는 대신, 두 자식 중 하나를 선택한다는 점이다.

🔖 9.3 쿼드 트리와 k-d 트리가 중요한 이유

핵심 정리

  • 쿼드 트리를 사용하면 한 번에 여러 차원을 분할함으로써 지역적인 영역의 데이터 점의 밀도에 맞게 격자 해상도를 조절할 수 있다.

  • k-d 트리는 최근접 이웃 탐색 문제를 해결하기 위해 이진 트리의 핵심 아이디어를 본받은 개념이다.

  • 각 노드에서 하나의 차원을 선택해 분할하는 방식을 써서, 다차원 데이터를 표현하는 트리에서 브랜칭 팩터가 커지는 문제를 해결한다.

  • 또한 k-d 트리는 데이터 구조에 적응해 더 많은 가지치기를 제공하기에 자료구조에 더 유연히 대응할 수 있다.

Last updated