Balanced Tree
항상 log(N)의 검색 성능
이진 트리를 확장해, 트리의 균형을 맞춰주는 것이 B트리의 핵심 기능이다.
정렬된 순서를 보장하고, 멀티레벨 인덱싱을 통한 빠른 검색을 할 수 있기 때문에 DB 에서 사용되는 자료구조 중 하나이다.
(실제 DB에서는 B트리에서 발전된 B+트리를 사용함.)
B트리는 이진트리와 다르게 하나의 노드가 많은 정보를 가질 수 있다. 최대 M개의 자식을 가질 수 있는 B트리를 M차 B트리라고 하며
다음과 같은 특징을 갖는다.
ex) 차수가 3인 B트리(최대 2개의 키를 포함할 수 있다.)
파란색 부분은 각 노드의 key를 나타내고, 빨간색 부분은 자식 노드들을 가리키는 포인터이다.
정렬방식은 이진 탐색 트리와 동일하게 오른쪽으로 갈수록 큰 값을 가진다.
루트노드에서 시작하여 하향식으로 검색을 수행한다. (이진 탐색 트리의 검색 과정과 동일하기에 자세한 설명 생략)
🔍 Case 1. 분할이 일어날 경우
리프노드에 key노드가 가득 찼다면, 노드를 분할해야 한다.
🔍 Case 2. 분할이 일어나지 않는 경우
오름차순으로 요소를 삽입한다.
용어 정리
inorder predecessor
: 노드의 왼쪽 자손에서 가장 큰 keyinorder successor
: 노드의 오른쪽 자손에서 가장 작은 key🔍 Case 1. 삭제할 key가 리프에 있는 경우
🔍 Case 2. 삭제할 key k가 내부 노드에 있고, 노드나 자식의 키가 최소 키 개수보다 많을 경우
inorder predecessor
또는 inorder successor
와 삭제할 k의 자리를 바꾼다.🔍 Case 3. 삭제할 key k가 내부 노드에 있고, 노드나 자식의 키가 최소 키 개수인 경우
key를 삭제하면 트리의 높이가 줄어들어 재구조화가 일어난다.
k를 삭제하고, k의 양쪽 자식을 병합하여 하나의 노드로 만든다.
k의 부모 key를 인접한 형제 노드에 붙인다. 이후, 이전에 병합했던 노드를 자식노드로 설정한다.
해당 과정을 수행하였을 때 부모노드의 개수에 따라 이후 수행 과정이 달라진다.
3-1. 만일 새로 구성된 인접 형제노드의 key가 최대 key 개수를 넘어갔다면, 삽입 연산의 노드 분할 과정을 수행한다.
3-2. 만일 인접 형제노드가 새로 구성되었을때 원래 k의 부모 노드가 최소 key의 개수보다 작아진다면, 부모 노드에 대하여 2번 과정부터 다시 수행한다.
동작 방식은 B-Tree와 유사하지만 리프노드가 연결리스트의 형태를 띄어 선형 검색이 가능하다.
이러한 특징 때문에 굉장히 작은 시간복잡도로 검색을 수행할 수 있다.
B트리와 동일하다.
💡Case 1. 분할이 일어나지 않고, 삽입 위치가 리프노드의 가장 앞 key 자리가 아닌 경우
B트리와 똑같은 삽입 과정을 수행한다.
💡Case 2. 분할이 일어나지 않고, 삽입 위치가 리프노드의 가장 앞 key 자리인 경우
삽입 후 부모 key를 삽입된 key로 갱신하고, data를 넣어준다.
💡Case 3. 분할이 일어나는 삽입과정
💡 Case 1. 삭제할 key k가 index에 없고, 리프노드의 가장 처음 key가 k가 아닌경우
기존의 B트리 삭제과정과 동일하다.
💡 Case 2. 삭제할 key k가 리프노드의 가장 처음 key인 경우
삭제할 key k가 리프노드의 가장 처음 key인 경우에는 항상 k가 index 내에 존재한다.
inorder successor
로 변경한다.