본문 바로가기
Study/SDBMS

SDBMS ⑥ The KD Tree

by garrrruii 2021. 4. 15.

 

SDBMS 공간데이터베이스

 

⑥ The KD Tree

 


 

 

1. KD Tree

: $k$-d tree, $k$-dimentional tree

 

$k$차원의 점을 관리하는 이진 트리 구조이다.

트리의 모든 leaf는 $k$차원의 점이고 non-leaf는 공간을 나누는 hyperplane*이다.

* 본래 공간보다 한 차원 하위의 공간이라고 생각하면 될 듯. 3차원이라면 평면, 2차원이라면 선분 등 

기본적으로는 중앙값을 기준으로 점을 두 영역에 나누고, 또 중앙값을 기준으로 나누는 걸 반복해

leaf에 한 개의 점이 할당될 때까지 재귀적으로 트리를 빌드한다.

 

위 그림에서는 $x$를 기준으로 먼저 축을 골라 ①의 좌우로 점들을 나누고

다음 단계에서는 $y$를 기준으로 축을 골라 점을 나눴다.

다시 $x$, $y$, $x$, $y$ 순으로 공간을 나눠 위와 같은 트리를 만들었다.

 

$k$=3이라면 $x$, $y$, $z$, $x$, $y$, $z$... 순으로 축을 선택해 나눌 수 있다.

 

경우에 따라 축을 $x$, $x$, $y$, $y$ 순으로 고르는 등 variation이 가능하다.

중앙값 대신 평균을 사용할 수도 있고,

새로운 점 정보를 삽입하면서 node split을 할 수도 있다.

 

 


 

 

2. Query

Search(v,R) node v를 기준으로 region R에 속하는 점을 구하는 쿼리

Search(v,R) {
	if(v.isleaf)
		if(v.point IN R) res += { v.point }
	else
		if(Region(v) IN R) res += { all points in v }
		else
			if(Region(v.left) INTERSECT R) Search(v.left,R)
			if(Region(v.right) INTERSECT R) Search(v.right,R)

}

range, window query 모두 이런 식으로 재귀적으로 찾으면 된다.

 

 

 


1.

사실 강의에서 깊게 파고들었던 내용은 아니었다. 그래서인지 내용이 이정도뿐,,,

이해하기도 어렵지 않고 최근에 Segment Tree를 정리해서 그런가 비슷해보인다. (이진트리니까)

구현도 비슷하게 할 수 있을 것 같아 시도했지만 아직 완성하지 못했다..ㅎ

 

2.

파이썬 라이브러리 scikit-learn에 구현이 되어있어 NN 등을 처리할 때 쓸 수 있다.

구현은 파이썬 코드로 위키에도 나와있다.

 

 

 

'Study > SDBMS' 카테고리의 다른 글

SDBMS ⑧ The R-Tree - Search, Delete, Variations  (0) 2021.08.26
SDBMS ⑧ The R-Tree - Insert, Split  (0) 2021.08.09
SDBMS ⑤ The Z-Ordering Tree  (0) 2021.04.08
SDBMS ④ The Linear Quadtree  (0) 2021.04.02
SDBMS ③ SAM, The Grid File  (0) 2021.03.29

댓글