Computer Science/Data Structure

[자료구조/C언어] Red-Black Tree | 2-3 Tree | B-Tree

2024. 6. 18. 15:14
목차
  1. 1. Red-Black Tree
  2. 1.1. Red-Black Tree란
  3. 1.2. Red-Black Tree 예시
  4. 1.3. Red-Black Tree 의 기능
  5. 1.4. Red-Black Tree 정리
  6. 2. 2-3 Tree
  7. 2.1. 2-3 Tree란?
  8. 2.2. 2-Node
  9. 2.3. 3-Node
  10. 2.4. 2-3 Tree의 기능
  11. 3. B - Tree
  12.  
  13. 4. AVL tree vs. red-black tree vs. B-tree
728x90

1. Red-Black Tree

1.1. Red-Black Tree란

  • Binary Search Tree의 일종이다.
  • Balance Tree의 일종이다.
  • 다음 조건을 만족하면 Red-Black Tree이다.
    • – P1. 모든 노드는 빨간색 또는 검은색이다.
      – P2. 각 NULL 포인터는 검은색으로 간주된다.
      – P3. root는 검은색이다.
      – P4. 어떤 노드가 빨간색이면, 그 노드의 두 자식은 모두 검은색입니다
      – P5. root에서 어떤 leaf 노드로 가는 모든 경로는 동일한 수의 black 노드를 포함한다.

1.2. Red-Black Tree 예시

1.3. Red-Black Tree 의 기능

1.3.1 Searching

  • Binary Search Tree랑 완전 같다.

Red-Black Tree Serch

// Recursive version
BSTNode* Search(BSTNode* root, Key key) {
	if (root == NULL || root->key == key) return root;
    else if (root->key > key) return Search(root->left_child, key);
    else return Search(root->right_child, key)
}

// Iterative version
BSTNode* Search(BSTNode* root, Key key) {
	BSTNode* cur = root;
    while (cur != NULL) {
    	if (cur->key == key) break;
        else if (cur->key > key) cur = cur->left_child;
        else
        	cur = cur->right_child;
    }
    return cur;
}

 

1.3.2 Insertion

  • 항상 삽입되는 노드는 빨간색이어야 한다.
  • 이것 역시 Binary Search Tree와 동일한 방식으로 삽입한다.
  • 여기서 Red-Black Tree에 위반되는 경우가 생기면 해당 기능을 수행해서 수정해야 한다.
    • Color promotion, single rotation, double rotation
  • Insertion 하는 경우를 살펴보자
    • Case 1: 아무것도 없다가 삽입하는 경우
      • 그냥 Red 노드 삽입 후 Black으로 색깔을 바꾸어서 P3에 위반되지 않게 고치면 된다.
    • Case 2: 삽입되는 X의 노드의 Uncle 노드가 red인 경우
      • Case 2에 해당되는 트리(Red-Black Tree에 위반된 경우)
        • 1. X의 Parent와 Uncle 노드를 검정색으로 바꾼다.
        • 2. X의 Grandparent 노드를 빨간색으로 바꾼다.
        • 3. 그러면 Grandparent도 규칙에 위반되므로 1,2의 과정을 recursive해서 Grandparent와 다른 sub tree에서도 수정한다.
        • Color Promotion 과정
          color promotion
          을 진행한다.
    • Case 3: 삽입되는 X의 노드의 Uncle 노드가 Black인 경우
      • single rotation(LL, RR rotation)을 진행한다.
      • 왼쪽 : LL Rotation을 해야 하는 경우 / 오른쪽 : RR Rotation을 해야 하는 경우
        • 1. X의 grandparent 노드를 빨간색으로 바꾼다.
        • 2. X의 parent 노드를 검정색으로 바꾼다.
        • 3. 트리의 모양에 따라 LL / RR rotation을 진행한다.
    • Case 4: 1) 삽입되는 X의 노드의 Uncle 노드가 Black이고 삽입되는 위치가 왼쪽 Subtree의 오른쪽 Node인 경우 |  2) 삽입되는 X의 노드의 Uncle 노드가 Black이고 삽입되는 위치가 오른쪽 Subtree의 왼쪽 Node인 경우
      • Double Rotation을 진행한다.
      • LR rotation 해야 하는 경우


      • RL rotation을 해야 하는 경우

        • 1. X의 grandparent 노드를 빨간색으로 바꾼다.
        • 2. X의 노드를 Black으로 바꾼다.
        • 3. 트리의 모양에 따라 LR / RL rotation을 진행한다.
  • Tree의 삽입은 아래 링크를 통해 그래픽으로 확인할 수 있다.

B-Tree Visualization (usfca.edu) 를 통해 삽입 과정에 대해 그래픽으로 확인할 수 있다.

 

B-Tree Visualization

 

www.cs.usfca.edu

 

 

1.4. Red-Black Tree 정리

  • 전반적인 과정은 Binary Search Tree와 비슷하다, 그러나 여기에 Rebalance를 위해 color promotion과 rotation을 수행한다.

 

2. 2-3 Tree

2.1. 2-3 Tree란?

  • 이것도 역시 Binary Search Tree의 확장판이다.
  • 모든 내부 노드에는 2-노드 또는 3-노드가 있다.
  • 2-노드: Children 2개인 요소가 1개 있다.
  • 3-노드: Children이 3개인 2개의 요소가 있다.
    – Self-balanced tree  : 모든 리프 노드가 동일한 높이에 있다.

 

2.2. 2-Node

  • 2-노드는 두 children이 있는 하나의 요소 X를 가진다.
  • L과 R을 왼쪽 자식 노드와 오른쪽 자식 노드라고 한다
    • X는 L의 모든 요소보다 크다
    • X는 R의 모든 요소보다 작다.
  • L과 R은 같은 높이를 가진 non-empty의 2-3 Trees이다.
  •  
    2-Node의 예시(아래 그래프)

2.3. 3-Node

  • 3-노드에는 X < Y인 두 개의 요소 X 및 Y가 있다.
  • L, M 및 R을 각각 왼쪽 자식 노드, 중간 자식 노드 및 오른쪽 자식 노드라고 한다.
    • L < X < M
    • M < Y < R
  • L, M 및 R은 동일한 높이의 non-empty 2-3 trees이다.

3-Node의 예시

 

2.4. 2-3 Tree의 기능

2.4.1. Searching

  • 간단하다. Binary Search Tree랑 같다.
  •  
    2-3 Tree의 Searching

2.4.2. Insertion

  • 다음과 같이 3가지 경우로 나누어진다.
    • Case1. 트리가 비어있는 경우
      • 노드를 생성하고 노드에 값을 입력한다.

    • Case2. 리프 노드가 하나의 값만을 가지는 경우
      • 단순히  노드에 새로운 값을 입력한다

    • Case3. 리프 노드가 2개의 값을 가지는 경우
      • 노드를 분할하고 3개의 값 부모의 중앙값을 뽑는다.
        • 부모가 3개의 값을 가지면 계속 분할하여 중앙값을 뽑고  필요한 경우 새 루트 노드를 구성한다.


B-Tree Visualization (usfca.edu)

 

B-Tree Visualization

 

www.cs.usfca.edu

 

2.4.3. Deletions

  • 두가지 Case로 나누어진다.
    • Case1. 제거할 노드가 leaf 노드인 경우
      • 리프 노드가 3-노드인 경우 요소를 삭제하기만 하면 된다.
      • 그렇지 않으면...
    • Case2. 제거할 노드가 internal 노드(leaf 노드가 아닌 노드)인 경우
      • 자식 중 한 명에게서 요소를 빌립니다

 

3. B - Tree

  • 2-3 Tree를 2-3-4 Tree로 확장하면
    • 4-Node: 4명의 Children이 있는 3개의 요소를 가지고 있게 된다.
  • 2-3-4 Tree

  • B-Tree
    • 2-3 트리와 2-3-4 트리의 일반화된 확장이라고 보면 된다.
    • 이것은 데이터베이스의 기록 색인에 널리 사용된다.

 

4. AVL tree vs. red-black tree vs. B-tree

  • 모두 self-balanced trees 이므로 검색, 삽입 및 삭제 작업은 O(log n)에 내에 수행한다.
    • n은 노드 수이다.
  • AVL Tree는 빈번한 검색에 더 효과적이다.
  • Red-Black Tree는 잦은 업데이트에 더 효과적입니다
  • B-트리는 대규모 data-set을 관리하는 데 효과적이며 디스크로부터 데이터에 엑세스를 해야한다.
저작자표시 (새창열림)

'Computer Science > Data Structure' 카테고리의 다른 글

[자료구조/C언어] 우선순위 큐 & 힙  (0) 2024.06.18
[자료구조/C언어] Hash  (0) 2024.06.18
[자료구조/C언어] Sorting Algorithms (정렬 알고리즘)  (0) 2024.06.18
[자료구조/C언어] AVL Tree  (0) 2024.06.18
  1. 1. Red-Black Tree
  2. 1.1. Red-Black Tree란
  3. 1.2. Red-Black Tree 예시
  4. 1.3. Red-Black Tree 의 기능
  5. 1.4. Red-Black Tree 정리
  6. 2. 2-3 Tree
  7. 2.1. 2-3 Tree란?
  8. 2.2. 2-Node
  9. 2.3. 3-Node
  10. 2.4. 2-3 Tree의 기능
  11. 3. B - Tree
  12.  
  13. 4. AVL tree vs. red-black tree vs. B-tree
'Computer Science/Data Structure' 카테고리의 다른 글
  • [자료구조/C언어] 우선순위 큐 & 힙
  • [자료구조/C언어] Hash
  • [자료구조/C언어] Sorting Algorithms (정렬 알고리즘)
  • [자료구조/C언어] AVL Tree
JuniTech
JuniTech
프로그래밍을 정복하기 위한 좌충우돌 코린이의 기록
JuniTech
Juni IT Technology
JuniTech
전체
오늘
어제
  • 분류 전체보기 (83)
    • Develop (29)
      • C, C++ (13)
      • Python (9)
      • Java (1)
      • JavaScript (0)
      • Arduino Uno (6)
    • CodingTest (38)
      • Baekjoon (36)
    • Project (0)
    • IT Issue (1)
    • Computer Science (11)
      • 프로그래밍 언어론 (3)
      • Open Source (3)
      • Data Structure (5)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • 🧑‍💻Github
  • 😎Juni의 잡동사니(일상 블로그)
  • 💰Juni의 투자일기(주식 블로그)

공지사항

인기 글

태그

  • 백준
  • 11000
  • 파스트리
  • 파이썬
  • 프로그래밍 역사
  • c++
  • 25206
  • Python
  • 구문법
  • 프로그래밍 어론
  • 10811
  • 10798
  • 프로그래밍어론
  • 포인터
  • 프어론
  • 아두이노 우노
  • 생존시간
  • 27866
  • LCD
  • 10988
  • 10812
  • 10797
  • 13241
  • Backjoon
  • 10810
  • 2083번
  • C
  • 문자열
  • 10813
  • pygame

최근 댓글

최근 글

hELLO · Designed By 정상우.
JuniTech
[자료구조/C언어] Red-Black Tree | 2-3 Tree | B-Tree
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.