- 자가 균형 이진 탐색 트리의 일종으로, 데이터베이스와 파일 시스템에서 널리 사용된다.
- 높은 차수의 균형 트리로, 각 노드가 여러 자식을 가질 수 있다.
- 모든 리프 노드는 동일한 레벨에 존재하기 때문에, B 트리는 O(logN)의 시간 복잡도를 갖는다.
특징
- 각 노드는 최대 M개의 자식을 가질 수 있다. 이러한 트리를 M차 B 트리라고 부른다.
- 루트 노드를 제외한 모든 노드는 최소 ⌈M/2⌉개의 자식을 가져야 한다.
- 노드는 데이터와 포인터로 구성되며, 데이터는 오름차순으로 정렬되어 있다. 정렬된 순서에 따라 자녀 노드들의 키 값의 범위가 결정된다.
- 각 노드는 최대 ⌈M/2⌉ - 1개에서 최대 M - 1개의 키를 가질 수 있다.
데이터 삽입
- 삽입은 항상 리프 노드에서 시작한다.
- 해당 리프 노드에 여유 공간이 있다면 데이터를 삽입한다.
- 노드가 가득 찬 경우, 가운데 키를 기준으로 좌우 키들을 분할하고, 가운데 키는 부모 노드로 올린다.
- 필요에 따라 루트 노드까지 반복적으로 분할 작업을 수행한다.
데이터 삭제
- 내부 노드에 있는 데이터를 삭제하려면 삭제할 데이터의 선임자나 후임자와 위치를 바꿔준다.
- 선임자나 후임자는 리프 노드에 위치한다.
- 따라서 삭제는 항상 리프 노드에서 발생한다.
- 삭제 후 노드가 최소 키 수를 만족하지 않는 경우:
- 키 수가 여유 있는 형제 노드에서 키를 받는다.
- 동생(왼쪽 형제)이 여유가 있으면:
- 동생의 가장 큰 키를 부모 노드의 나와 동생 사이에 둔다.
- 원래 그 자리에 있던 키는 나의 가장 왼쪽에 둔다.
- 형(오른쪽 형제)이 여유가 있으면:
- 형의 가장 작은 키를 부모 노드의 나와 형 사이에 둔다.
- 원래 그 자리에 있던 키는 나의 가장 오른쪽에 둔다.
- 동생(왼쪽 형제)이 여유가 있으면:
- 1번이 불가능하면 부모 노드에서 키를 받고 형제와 병합된다.
- 동생이 있으면:
- 동생과 나 사이의 키를 부모로부터 받는다.
- 그 키와 나의 키를 차례대로 동생에게 합친다.
- 나의 노드를 삭제한다.
- 동생이 없으면:
- 형과 나 사이의 키를 부모로부터 받는다.
- 그 키와 형의 키를 차례대로 나에게 합친다.
- 형의 노드를 삭제한다.
- 동생이 있으면:
- 키 수가 여유 있는 형제 노드에서 키를 받는다.
- 루트 노드까지 필요한 경우 병합 및 키 이동 작업을 반복한다.
- 루트 노드가 비어있다면:
- 루트 노드를 삭제한다.
- 직전에 병합된 노드가 새로운 루트 노드가 된다.
- 루트 노드가 비어있다면:
B Tree가 DB 인덱스로 사용되는 이유
B 트리, AVL 트리, RB 트리 모두 O(logN)의 시간 복잡도를 가지지만, B 트리가 데이터베이스 인덱스로 널리 사용되는 이유는 그 구조가 디스크 I/O와 잘 맞아떨어지기 때문이다.
- 데이터베이스는 대량의 데이터를 저장하고 관리하기 위해 디스크에 의존한다. 디스크 I/O는 시스템 성능의 주요 병목 중 하나로, 가능한 한 적은 횟수로 많은 데이터를 읽는 것이 중요하다.
- B 트리는 각 노드에 여러 개의 키와 자식 포인터를 저장할 수 있다. 이러한 노드는 디스크의 하나의 블록에 해당하며, 디스크 I/O 한 번으로 다수의 키를 메모리로 불러올 수 있다. 때문에 디스크에 접근하는 횟수가 적으며 블록 단위의 저장 공간을 알차게 사용할 수 있다.
- B 트리는 높은 차수(degree)를 가질 수 있어, 트리의 높이가 낮다. 트리의 높이가 낮을수록 데이터에 접근할 때 필요한 디스크 I/O 횟수가 줄어들어 성능이 향상된다.
블록은 데이터를 저장하고 관리하는 기본적인 단위로, 디스크에서의 읽기/쓰기 작업의 최소 단위다.
728x90
'자료구조 & 알고리즘' 카테고리의 다른 글
Red-Black 트리 (0) | 2024.08.13 |
---|---|
AVL 트리 (0) | 2024.08.13 |
이진 탐색 트리 (Binary Search Tree, BST) (0) | 2024.08.13 |
Set (0) | 2024.08.13 |
Map & Hash table (0) | 2024.08.12 |