[Java] B-트리
by Ungbae

본 게시글은 학부 강의 '자료구조', 온라인 강의 'Honglab Data Structure(https://www.honglab.ai/)' 그리고 강의 교재 '자바와 함께하는 자료구조의 이해'의 내용들을 바탕으로 이해한 내용을 정리하였습니다.

데이터를 더 많이 담고 싶은데... 노드를 더 크게 만들어 보는거야
레드 블랙 트리나 B-트리 모두 2-3트리에서 나온 개념이다. 아무래도 대용량의 데이터를 다루기 위해 나온 자료구조이기 때문에 데이터베이스 분야에서 많이 쓰이는 형태라 할 수 있겠다.
B-트리
- 다수의 키를 가진 노드로 구성되어 다방향 탐색(Multiway Search)이 가능한 균형 트리
- 2-3 트리는 B-트리의 일종으로 노드에 키가 2개까지 있을 수 있는 트리
- B-트리는 대용량의 데이터를 위해 고안되어 주로 데이터베이스에 사용
노드에 수백에서 수천 개의 키를 저장하여 트리의 높이를 낮추자
B-트리의 정의
차수가 M인 B-트리는 다방향 탐색 트리이다.
- 모든 이파리는 같은 동일한 깊이를 갖는다.
- 루트가 아닌 각 노드의 자식 수는 [M/2] 이상 M 이하
- 루트의 자식 수는 2이상

탐색 연산

- B-트리에서의 탐색은 루트로부터 시작
- 방문한 각 노드에서는 탐색하는 키와 노드의 키들을 비교하여, 적절한 서브트리를 탐색
- 단, B-트리의 노드는 일반적으로 수백 개가 넘는 키를 가지므로 각 노드에서는 이진 탐색 수행
삽입 연산
- B-트리에서의 삽입은 탐색과 동일한 과정을 거쳐 새로운 키가 저장되어야 할 이파리를 찾는다.
- 이파리에 새 키를 수용할 공간이 있다면, 노드의 키들이 정렬 상태를 유지하도록 새 키를 삽입
- 이파리가 M-1개의 키를 가지고 있으면, M-1개의 키와 새 키 중에서 중간값이 되는 키(중간 키)를 부모로 올려보내고, 남은 M-1개의 키를 1/2씩 나누어 각각 별도의 노드에 저장<분리(Split) 연산>
e.g. 45 삽입하기



삭제 연산
- B-트리에서의 삭제는 항상 이파리에서 이루어진다.
- 삭제할 키가 내부 노드에 있으면, 중위 선행자나 중위 후속자를 삭제할 키와 교환한 후 이파리에서 삭제 수행
- 삭제는 이동(Transfer) 연산과 통합(Fusion) 연산 사용
- 이동 연산 : 이파리에서 키가 삭제된 후웨 키의 수가 [M/2] - 1보다 작으면, 자식 수가 [M/2]보다 작게 되어 B-트리 조건을 위반. 이때 노드의 좌우의 형제 중에서 도움을 줄 수 있는 노드로부터 1개의 키를 부모를 통해 이동
e.g. 5 삭제하기


통합 연산
키가 삭제된 후 underflow가 발생한 노드 x에 대해 이동 연산이 불가능한 경우, 노드 x와 그의 형제를 1개의 노드로 통합하고, 노드 x와 형제의 분기점 역할을 하던 부모의 키를 통합된 노드로 끌어내리는 연산
e.g. 7 삭제하기



B-트리의 확장
B* - 트리
- B*-트리는 B-트리로서 루트를 제외한 다른 노드의 자식 수가 2/3M~M이어야 한다. 즉, 각 노드에 적어도 2/3 이상이 키들로 채워져 있어야 한다는 것.
- B-트리에 비해 B*-트리는 공간을 효율적으로 활용한다.
B+ - 트리
- 실제로 가장 널리 활용되는 B-트리이다.
- 키 만을 가지고 B-트리를 구성, 이파리에 키와 관련(실제) 정보를 저장한다.
- 키로 구성된 B-트리는 탐색, 삽입, 삭제 연산을 위해 관련된 이파리를 빠르게 찾을 수 있도록 안내해주는 역할만 수행한다.
- 전체 레코드를 순차적으로 접근할 수 있도록 연결 리스트로 구현한다.

성능 분석
- B-트리에서 삽입이나 삭제 연산의 수행 시간은 각각 B-트리의 높이에 비례. 차수가 M이고 키의 개수가 n인 B-트리의 최대 높이는

- B-트리는 키들의 비교 횟수보다 디스크와 메인 메모리 사이의 블록 이동(Transfer) 수를 최소화 해야한다.
- B-트리의 최고 성능을 위해서는 1개의 노드가 1개의 디스크 페이지에 맞도록 차수 M을 정한다.
- 실제로 B-트리들은 M의 크기를 수백에서 수천으로 사용한다.
- M = 200이고 n = 1억 이라면 B-트리의 연산은 4개의 디스크 블록만 메인 메모리로 읽어 들이면 처리가 가능하다.
- 성능 향상을 위해 루트는 메인 메모리에 상주
응용
- B-트리, B+ -트리는 대용량의 데이터를 저장하고 유지하는 다양한 데이터베이스 시스템의 기본 자료구조로 활용
- Windows 운영체제의 파일 시스템 : HPFS(High Performance File System)
- 매킨토시 운영체제의 파일 시스템 : HFS(Hierarchical File System)과 HFS+
- 리눅스 운영체제의 파일 시스템 : ReiserFS, XFS, Ext3FS, JFS
- 상용 데이터베이스 : ORACLE, DB2, INGRES와 오픈소스 DBMS인 PostgreSQL에서 사용
'CS & AI > Data Structure' 카테고리의 다른 글
| [Java, C++] 해시테이블(Hash Table) (2) | 2025.06.15 |
|---|---|
| [Java] 레드 블랙 트리 (9) | 2025.06.05 |
| [Java] 2-3 트리 (1) | 2025.06.03 |
| [Java, C++] AVL 트리 (2) | 2025.05.29 |
| [Java, C++] 이진 탐색 트리(Binary Search Tree) (2) | 2025.05.26 |
블로그의 정보
그럼에도 불구하고
Ungbae