Advanced Tree
데이터의 삽입, 삭제, 탐색 연산을 O(log n) 시간 안에 수행하도록 균형을 유지하는 것이 핵심
1. Red-Black Tree
이진 탐색 트리(BST)의 한 종류로, 트리의 높이를 균형 있게 유지하기 위해 노드에 색깔 정보(빨강/검정) 를 추가한 구조
즉, 삽입이나 삭제 시 트리가 한쪽으로 치우치지 않게 색깔 변경과 회전(rotation) 을 수행해 항상 log n 높이를 보장함
| 장점 | 단점 |
| 트리의 균형을 유지하므로 항상 빠른 검색 성능 보장 삽입, 삭제 시 회전이 많지 않아 AVL보다 구현이 단순 |
완전한 균형은 아니므로 AVL보다 탐색은 약간 느릴 수 있음 |
- Red-Black Tree의 규칙
모든 노드는 red 또는 black 색을 가진다.
다음의 다섯 가지 성질을 항상 만족해야 한다.
- 각 노드는 빨강 또는 검정이다.
- 루트 노드는 항상 검정이다.
- 모든 리프(NIL) 노드는 검정이다.
- 빨강 노드의 자식은 반드시 검정이다.
→ 즉, 빨강 노드는 연속으로 나올 수 없다. - 임의의 노드에서 리프까지 가는 모든 경로에는 동일한 수의 검정 노드가 있다.
→ 이를 “black-height”라고 한다.
이 규칙들을 통해 트리의 높이는
2 * log2(n + 1) 이하로 제한되어, 균형이 보장된다.
- Insertion
- 일단 BST 규칙에 따라 삽입
→ 새 노드는 항상 빨강(red) 으로 삽입된다. - Red-Black 속성 위반 검사
삽입 후, 위의 다섯 규칙 중 위반된 것이 있으면 수정한다. - 색 변환 & 회전 수행
- Case 1: 삽입된 노드의 삼촌이 빨강 → 부모·삼촌을 검정, 할아버지를 빨강으로 바꿈
- Case 2: 삼촌이 검정이고, 삽입된 노드가 오른쪽 자식 → 왼쪽 회전
- Case 3: 삼촌이 검정이고, 삽입된 노드가 왼쪽 자식 → 오른쪽 회전
→ 회전(rotation)을 통해 트리의 균형을 유지한다.
- Deletion
- BST 삭제 규칙으로 우선 노드를 삭제.
- 삭제로 인해 Red-Black 속성이 깨질 수 있으므로,
“double black” 상태를 해결하기 위해 색상 변경, 형제 노드 색상 검사, 회전을 수행한다.
- 시간 복잡도
탐색, 삽입, 삭제 모두 O(log n)
- 활용 예시
- Linux 커널의 프로세스 관리 (CFS Scheduler)
- C++ STL의 std::map, std::set
- Java의 TreeMap, TreeSet
2. B-Tree
B-Tree는 이진 트리의 일반화 버전으로, 하나의 노드가 여러 개의 키(key)와 자식(child)을 가질 수 있다.
디스크 접근(입출력)이 많은 환경(예: 데이터베이스, 파일시스템)에서
탐색 효율을 극대화하기 위해 설계된 균형 다진 탐색 트리 (Balanced m-ary Search Tree)
| 장점 | 단점 |
| 디스크 접근 횟수 최소화 (I/O 효율적) 높이가 매우 낮음, 대용량 데이터에 적합 균형 자동 유지 |
각 노드가 커서 메모리 관리가 복잡 단순한 메모리 내 탐색에는 오히려 비효율적 |
- 구조
B-Tree의 차수(degree) = 한 노드가 가질 수 있는 최대 자식 수 (m)
- 각 노드는 최대 m개의 자식, m−1개의 키를 가질 수 있음
- 모든 리프 노드는 같은 깊이에 존재
- 루트 노드는 최소 2개 이상 자식을 가질 수 있음 (특수 경우 제외)
- 노드의 키들은 항상 오름차순 정렬되어 있음
- Search
- 현재 노드의 키를 이진 탐색으로 탐색
- 키가 존재하면 반환, 없으면 해당 구간의 자식 노드로 이동
- 리프에 도달할 때까지 반복
→ 시간복잡도: O(logₘ n) (트리의 높이가 매우 낮음)
- Insertion
- 새로운 키를 삽입할 리프 노드를 찾음.
- 해당 노드가 꽉 차 있지 않으면 바로 삽입.
- 꽉 차 있다면 노드 분할(split) 발생
- 중간 키를 부모로 올리고
- 왼쪽/오른쪽 노드로 나누어 저장
- 부모도 꽉 차 있으면 위로 계속 분할을 전파
→ 루트가 분할될 수도 있다 (트리의 높이가 1 증가)
- Deletion
- 삭제할 키가 리프 노드에 있으면 바로 삭제
- 내부 노드에 있으면,
→ 전임자(predecessor) 혹은 **후임자(successor)**로 교체 - 삭제 후, 최소 키 수 조건을 위반하면
→ 병합(merge) 또는 재분배(redistribute) 수행
- 활용 예시
- 데이터베이스 인덱스 (MySQL, PostgreSQL 등)
- 파일 시스템 (NTFS, HFS+, EXT4)
Red-Black Tree vs B-Tree 비교
| 항목 | Red-Black Tree | B-Tree |
| 구조 | 이진 탐색 트리 | 다진 탐색 트리 (m-ary) |
| 균형 유지 | 색상 + 회전으로 유지 | 노드 분할·병합으로 유지 |
| 목적 | 메모리 내 효율적 탐색 | 디스크 기반 I/O 최소화 |
| 높이 | 약 log₂n | 약 logₘn (더 낮음) |
| 삽입/삭제 | 회전 필요 (빠름) | 분할/병합 필요 (느림) |
| 사용 예 | STL map, TreeSet | DB 인덱스, 파일시스템 |
'이론공부 > 자료구조, 알고리즘' 카테고리의 다른 글
| 8. Hashing (0) | 2025.11.13 |
|---|---|
| 7. Sorting (3) (0) | 2025.11.12 |
| 7. Sorting (2) (0) | 2025.11.12 |
| 7. Sorting (1) (0) | 2025.11.11 |
| 6. Graph (3) - Shortest Path (0) | 2025.11.11 |