RB Tree 이론

올리브수
|2022. 11. 29. 23:31
728x90

균형 이진 탐색 트리(Balanced BST)

  • 루트 노드로 부터 시작해서 찾고자하는 key 를 각 레벨에 따라 한번의 비교를 통해 key 값을 찾을 수 있다.
  • $O(h)$ (h : 높이) 의 시간 복잡도를 가진다.

 

insert, delete 연산 모두 search의 영향을 받는다.

 

  • 이진 트리의 높이
    • $lg(n+1) <= h <= n - 1$
    • 최악의 경우(한 쪽으로 치우친 경우) : $n-1$
    • 최선의 경우(완전 이진 트리) : $lg(n+1)$

 

균형 이진 탐색 트리는 강제로 이진 탐색 트리의 높이를 $lg(n + 1)$ 로 유지하게 끔 조정을 한다.

  • AVL Tree
  • RED-BLACK Tree
  • (2, 3, 4) - Tree
  • splay Tree

 

 

 


Rotation

  • rotation : 높이를 조정하는 작업을 통해 전체 트리의 높이를 조정한다.
  • 필요에 따라 left rotation과 right rotation을 수행한다.
  • 한 쪽 서브트리의 높이가 다른 쪽 서브트리의 높이보다 크면 높이가 큰 쪽에서 작은 쪽으로 rotation을 수행한다.
  • rotation을 여러 번 반복해서 트리의 높이를 맞추는 작업을 수행한다.

 

//@self : 균형 이진 트리
//@z : z를 기준으로 rotation을 수행하라
def rotateRight(self, z):
        if not z : return // z가 NIL일 때
        x = z.left

        if not x : return // z의 left node NIL
        b = x.right

        x.parent = z.parent // first link rotation

        // z의 parent가 NIL -> 루트일 때
        // second link rotation
        if z.parent:
                if z.parent.left is z:
                            z.parent.left = x
                else:
                            z.parent.right = x

        x.right = z // third link rotation
        z.parent = x // fourth link rotation
        z.left = b // fifth link rotation

        // sixth link rotation
        if b: // b가 NIL이 아니면
                b.parent = z

        // 하필 z가 root였다면 root 정보도 update
        if self.root is z:
                self.root = x

 

 

 


Red-Black Tree

: 가장 유명하고 많이 사용되는 균형 이진 탐색 트리

⭐ 특이하게 leaf node는 NIL이다.

1. 모든 노드는 red/black으로 구성된다.

2. root 노드 : black

3. leaf 노드 : black

4. red 노드의 자식노드는 무조건 black이다.

5. 각 노드에서 leaf 노드 까지의 black 노드의 수는 모두 동일하다.

 

⚠️ 그러나 black 노드의 자식노드가 무조건 red여야하는 건 아니다. → 상관없음!

  • 이진 탐색 트리의 단점 보완 → 트리의 높이가 계속 커지면 검색에 불리해진다.
  • 최악의 경우 노드 탐색의 시간 복잡도는 log(n)이 소요될 수 있다.
  • 높이는 항상 O(lg n)을 유지해야한다.

 

$h(v)$ = v의 높이(height) → leaf 노드 제외

$bh(v)$ = v에서 v를 제외한 leaf node까지의 black 노드의 개수

 

 

  • 사실 1 : v 서브 트리의 내부 노드의 개수 ≥ $2^{bh(v)} - 1$
    • 내부 노드의 개수가 적어지면 그만큼 높이는 커진다.
    • 증명 : h(v)에 대한 귀납법

 

  • 사실 2 : black 노드의 수 ≥ h / 2
    • Ex. r(root)의 서브트리의 내부 노드 개수(= red-black-tree의 노드 개수) ≥ $2^{bh(r)} -1$

 

  • 증명
    • $2^{\frac h 2} <= n + 1$
    • $\therefore h = O(lg n)$
    • $h <= 2log_2(n+1)$
    • $n >= 2^{\frac h 2}-1$

⭐ red 노드의 자식은 항상 black 노드이다.

  • black 노드는 최소한 높이의 1/2 이상이 존재한다.
  • 조건 5에 따르면 임의의 노드 v로 부터 leaf 노드까지 블랙 노드의 개수가 일정하므로 균형잡힌 트리로 유지할 수 있다.(한쪽으로 치우치지 않음)

 

 

 


🔗 Reference

 

 

 

728x90

'🌱 Dev Diary > 📄 TIL' 카테고리의 다른 글

Team Session - Data Segment  (0) 2022.12.08
RB Tree 구현  (0) 2022.12.06
C 정복하기(2) - 메모리 할당  (0) 2022.11.28
C 정복하기(1) - 포인터  (0) 2022.11.28
알고리즘 이론 - 이진 트리  (0) 2022.11.16