티스토리 뷰
이진탐색트리(Binary Search Tree)
- 최대 자식노드를 2개 갖는 이진트리
- 정렬된 상태로 유지되기 때문에 탐색 효율이 좋음 (중위순회시 정렬된 상태로 출력됨)
- Balanced Tree가 아니기 때문에 극단적으로 모든 노드가 자식노드를 1개씩만 갖게 되면 O(n) 성능을 보임
Red-Black Tree
- 이진탐색트리의 일종이지만 Balanced Tree이기 때문에 성능을 O(logN)으로 보장함
- 이진탐색트리의 일종이므로 왼쪽 서브트리의 모든 값은 오른쪽 서브트리의 모든 값보다 작아야 함(정렬됨)
- Red-Black Tree는 이진탐색트리 중에서 성능이 가장 좋다.
- 따라서 리눅스 커널의 프로세스 관리, Java 8이상 HashMap에서 해쉬 블록의 value, 함수형 프로그래밍 등에서 많이 사용되는 트리이다.
1) 조건
- Root Property : root노드의 색깔은 검정이다.
- External Property : 모든 leaf 노드(external 노드)는 검정이다.
- Internal Property : 빨간 노드의 자식은 검정이다. (No Double Red : 빨간 노드가 연속으로 나올 수 없다.)
- Depth Property : 모든 leaf 노드에서의 black depth는 같다.
cf. black depth : leaf 노드에서 root 노드로 가는 중에 만나는 블랙 노드의 개수
** 위와 같은 네 가지의 조건을 만족하도록 트리 구조를 유지하면 depth를 항상 logN에 바운드하게 한다.
2) Double Red가 발생했을 때 해결법
1) Restructuring
- 트리 구조를 바꾸는 작업으로 Restructuring 자체는 O(1)이 소요되지만 Restructuring이 발생하려면 데이터 삽입 또는 삭제가 발생해야 하기 때문에 데이터 삽입/삭제 + Restructuring 은 O(logN)이다.
- Restructuring은 한 번만 실행되더라도 다른 서브트리에 영향을 주지 않으므로 트리 재구성이 완성된다.
2) Recoloring
- 한 번에 안 끝날 가능성이 있다. 즉, Recoloring을 한번 한 후의 구조에서 또 다시 Double Red가 발견될 수 있다.
- 이러한 특성은 최악의 경우 root 노드까지 전파된다.
- Recoloring 한 번자체는 O(1)이 소요되지만 root까지 전파될 경우 O(logN) 성능을 보인다.
** 결론: Red-Black Tree에 삽입 연산을 할 경우 Double Red가 발생할 수 있고 이를 해결하기 위해 Restructuring 또는 Recoloring을 하며 두 경우 모두 O(logN) 성능을 보인다. 따라서 Red-Black Tree에 대한 삽입 연산의 성능은 O(logN)이다.
cf. 리눅스 커널에서 사용하는 레드블랙트리
- task_struct 구조체를 노드로 해 task들을 관리함
cf. Java 8이상 버전에서의 HashMap.
- 해쉬 버킷에 충돌이 발생할 경우, HashMap은 기본적으로 Separate Chaining 방식으로 충돌을 처리하기 때문에 버킷에 여러 데이터들이 들어간다. 이때 그 개수가 8개 이상인 경우에 대해 버킷 데이터들을 Red-Black Tree로 관리한다.
Red-Black Tree를 사용하는 이유
- 기본적으로 Tree에서 O(logN) 성능을 보이기 위해서는 균형이 있느냐 없느냐가 매우 중요함
- 레드블랙트리는 항상 균형을 유지하기 때문에 O(logN) 을 보장함
- Double Red 발생은 트리 구조가 변경될 때 발생할 수 있으며 이를 해결하기 위한 Restructuring, Recoloring 모두 O(logN) 성능을 가짐
- 따라서 레드블랙트리는 어떠한 경우에도 O(logN)을 보장하기 때문에 성능이 좋음
cf. 데이터베이스 인덱스에서 Red-Black tree를 사용하지 않고 B-Tree를 사용하는 이유 :
- 레드블랙트리도 정렬을 유지하지만, B-Tree와의 가장 큰 차이점은 한 노드당 데이터의 개수이다.
- B-Tree의 경우 한 노드당 데이터를 2개 이상 넣을 수 있고 배열로 관리한다.
- 따라서 간단한 포인터연산으로 빠르게 데이터를 가져올 수 있다. (CPU를 덜 사용함)
- 이러한 특징은 범위 탐색 연산에서도 효율적이다.
- 또한 같은 양의 데이터를 Red-Black Tree에 넣는 것보다 B -ree에 넣는 것이 tree의 depth가 더 낮다.
Reference
- 레드블랙트리 시뮬레이터 https://www.cs.usfca.edu/~galles/visualization/RedBlack.html
'[ Basic ] > # 알고리즘' 카테고리의 다른 글
[백준] 2206 : DFS와 BFS차이 (0) | 2022.02.13 |
---|---|
크루스칼(MST) vs 다익스트라 비교 (0) | 2022.02.03 |
[백준] 이중 우선순위 큐 (TreeMap) (0) | 2022.01.17 |
[백준] 12919 시간복잡도 풀이 (0) | 2022.01.05 |
[BinarySearch] 백준 1920 (0) | 2021.08.04 |
- Total
- Today
- Yesterday
- LFCS
- helm
- Linux
- Java
- Stream
- Kubernetes
- 카프카
- Controller
- 컨트롤러
- 우분투
- github actions
- argocd
- docker
- go
- ubuntu
- container
- 쿠버네티스
- spring
- 코틀린
- golang
- jvm
- CICD
- GitOps
- RDB
- K8s
- ci/cd
- kafka
- db
- rolling update
- Non-Blocking
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |