[Week05][C] Rbtree

PyotatoΒ·2023λ…„ 5μ›” 10일
0

[Cμ–Έμ–΄]

λͺ©λ‘ 보기
2/5
post-thumbnail

폴더 ꡬ쑰
πŸ“rbtree-lab
γ„΄πŸ“src
γ„΄πŸ—’οΈdriver.c : mainμ‹€ν–‰ν•¨μˆ˜
γ„΄πŸ—’οΈMakefile : 컴파일 κ³Όμ • λ‹¨μˆœν™”
γ„΄πŸ—’οΈrbtree.c : ν•¨μˆ˜ κ΅¬ν˜„ 파일
γ„΄πŸ—’οΈrbtree.h : 헀더 파일
γ„΄πŸ“test
γ„΄πŸ—’οΈMakefile
γ„΄πŸ—’οΈtest-rbtree.c: ν…ŒμŠ€νŠΈ λͺ¨μŒ

RED-BLACK TREE πŸ”΄βš«

  • μžκ°€ κ· ν˜• 이진 탐색 νŠΈλ¦¬λ‘œμ„œ μ—°κ΄€ λ°°μ—΄ 등을 κ΅¬ν˜„ν•˜λŠ”λ° μ“°μ΄λŠ” 자료 ꡬ쑰이닀.
  • 높이가 h 인 이진 탐색 νŠΈλ¦¬μ—μ„œ μ‚½μž…, 검색, μ‚­μ œ λ“±κ³Ό 같은 λ™μž‘μ΄ O(h) 의 μ‹œκ°„μ— μˆ˜ν–‰λ  수 μžˆλŠ”λ°, μ΅œμ•…μ˜ 경우 (이진 탐색 트리의 높이가 클 경우) μ‹€ν–‰ 속도가 일반적인 μ—°κ²° λ¦¬μŠ€νŠΈμ™€ λΉ„μŠ·ν•œ 정도에 λΈ”κ°€ν•˜λ‹€.
  • λ ˆλ“œ λΈ”λž™ νŠΈλ¦¬λŠ” νŠΈλ¦¬κ°€ κ· ν˜•μ„ 이루도둝 μ„€κ³„λœ 검색 트리 ꡬ쑰 쀑 ν•˜λ‚˜μ΄λ‹€. 자료의 μ‚½μž… κ³Ό μ‚­μ œ, 검색 의 λ™μž‘μ΄ μ΅œμ•…μ˜ κ²½μš°μ—λ„ λ ˆλ“œ λΈ”λž™ 트리의 높이인 O(logn) μ‹œκ°„μ— μˆ˜ν–‰λ˜λ„λ‘ 보μž₯ν•œλ‹€.

Red-Black TREE

νŠΉμ§•

  • 각각의 λ…Έλ“œκ°€ λ ˆλ“œ λ‚˜ λΈ”λž™ 인 색상 속성을 가지고 μžˆλŠ” 이진 탐색 νŠΈλ¦¬μ΄λ‹€. λ”°λΌμ„œ 이진 탐색 트리의 일반적인 쑰건을 λ§Œμ‘±ν•œλ‹€.

  • 트리의 각 λ…Έλ“œλŠ” color, key, left, right λ“±μ˜ ν•„λ“œλ₯Ό κ°–λŠ”λ‹€.

  • λ ˆλ“œ-λΈ”λž™ 트리 μ½”λ“œμ—μ„œ ν•œκ³„ 쑰건을 닀루기 νŽΈλ¦¬ν•˜λ„λ‘ NIL을 ν‘œν˜„ν•˜κΈ° μœ„ν•΄ ν•˜λ‚˜μ˜ κ²½κ³„λ…Έλ“œ(SENTINEL)을 μ‚¬μš©ν•œλ‹€.

  • NILλ…Έλ“œμ˜ 색은 검정색이닀.

  • ν•œ λ…Έλ“œμ˜ μžμ‹ λ˜λŠ” λΆ€λͺ¨κ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ©΄ 그에 λŒ€μ‘λ˜λŠ” λ…Έλ“œμ˜ 포인터 ν•„λ“œλŠ” NIL κ°’μœΌλ‘œ μ±„μ›Œμ§„λ‹€.

  • ν•œ λ…Έλ“œ xμ—μ„œ λ¦¬ν”„λ…Έλ“œκΉŒμ§€μ˜ κ²½λ‘œμ— μžˆλŠ” λͺ¨λ“  κ²€μ • λ…Έλ“œ(x μžμ‹ μ€ μ œμ™Έ)λ₯Ό κ·Έ λ…Έλ“œμ˜ 흑색 높이(black-height)라 ν•˜κ³  bh(x) 라고 ν•œλ‹€.

  • μ•„λž˜ 쑰건을 λ§Œμ‘±ν•΄μ•Ό μœ νš¨ν•œ λ ˆλ“œ-λΈ”λž™ νŠΈλ¦¬κ°€ λœλ‹€.

  1. λ…Έλ“œμ˜ 색은 λ ˆλ“œπŸ”΄ ν˜Ήμ€ λΈ”λž™βš« μ€‘μ˜ ν•˜λ‚˜μ΄λ‹€.
  2. 루트 λ…Έλ“œ 색은 λΈ”λž™βš« 이닀
  3. λͺ¨λ“  리프 λ…Έλ“œλ“€(NIL) 은 λΈ”λž™βš« 이닀.
  4. λ ˆλ“œπŸ”΄ λ…Έλ“œμ˜ μžμ‹λ…Έλ“œ μ–‘μͺ½μ€ μ–Έμ œλ‚˜ λͺ¨λ‘ λΈ”λž™βš« 이닀. (λ ˆλ“œ λ…Έλ“œλŠ” 연달아 λ‚˜νƒ€λ‚  수 μ—†μœΌλ©°, λΈ”λž™ λ…Έλ“œλ§Œμ΄ λ ˆλ“œ λ…Έλ“œμ˜ λΆ€λͺ¨ λ…Έλ“œκ°€ 될 수 μžˆλ‹€)
  5. μ–΄λ–€ λ…Έλ“œλ‘œλΆ€ν„° μ‹œμž‘λ˜μ–΄ 그에 μ†ν•œ ν•˜μœ„ 리프 λ…Έλ“œμ— λ„λ‹¬ν•˜λŠ” λͺ¨λ“  κ²½λ‘œμ—λŠ” 리프 λ…Έλ“œλ₯Ό μ œμ™Έν•˜λ©΄ λͺ¨λ‘ 같은 개수의 λΈ”λž™βš« λ…Έλ“œκ°€ μžˆλ‹€.

κ΅¬ν˜„ λ²”μœ„

λ‹€μŒ κΈ°λŠ₯듀을 μˆ˜ν–‰ν•  수 μžˆλ„λ‘ RB Tree κ΅¬ν˜„

생성

  • tree = new_tree(): RB Tree ꡬ쑰체 생성

νšŒμ „

  • left_rotation(tree, node): ν•΄λ‹Ή nodeλ₯Ό κΈ°μ€€μœΌλ‘œ RB Tree μ™Όμͺ½ 회, κΈ°μ€€ nodeκ°€ μ—†λ‹€λ©΄ λ°˜ν™˜
    -right_rotation(tree, node): ν•΄λ‹Ή nodeλ₯Ό κΈ°μ€€μœΌλ‘œ RB Tree 였λ₯Έμͺ½ νšŒμ „, κΈ°μ€€ nodeκ°€ μ—†λ‹€λ©΄ λ°˜ν™˜

λ…Έλ“œ μ‚½μž…

  • tree = rbtree_insert(tree, key): RB Tree에 ν‚€ 값이 key인 μƒˆλ‘œμš΄ λ…Έλ“œ μ‚½μž… ν›„ 루트 λ°˜ν™˜
  • rbtree_insert_fixup(tree, node) : λ…Έλ“œ μ‚½μž… ν›„ RB Tree νŠΉμ„± λ§Œμ‘±μ‹œν‚€κΈ° μœ„ν•΄ λ…Έλ“œμ˜ 색 λ³€κ²½ 및 νšŒμ „ μˆ˜ν–‰

λ…Έλ“œ μ‚­μ œ

  • rbtree_erase(tree, node) : λ…Έλ“œμ˜ ν‚€λ₯Ό μ΄μš©ν•˜μ—¬ RB Treeμ—μ„œ λ…Έλ“œ μ‚­μ œ
    -rbtree_delete_fixup(tree, node) : μ‚­μ œ μˆ˜ν–‰ ν›„ RB Tree νŠΉμ„±μ„ λ§Œμ‘±μ‹œν‚€κΈ° μœ„ν•΄ λ…Έλ“œμ˜ 색 λ³€κ²½ 및 νšŒμ „ μˆ˜ν–‰

μœ ν‹Έ

  • ptr = tree_find(tree, key)
    • RB tree내에 ν•΄λ‹Ή keyκ°€ μžˆλŠ”μ§€ νƒμƒ‰ν•˜μ—¬ 있으면 ν•΄λ‹Ή node pointer λ°˜ν™˜
    • μ—†μœΌλ©΄ NIL λ°˜ν™˜
  • delete_rbtree(tree) : RB Tree에 ν• λ‹Ήλ˜μ—ˆλ˜ λ©”λͺ¨λ¦¬ λ°˜ν™˜ 및 트리 μ‚­μ œ
  • free_node(tree, node) : RB Tree 내뢀에 ν• λ‹Ήλ˜μ—ˆλ˜ λ…Έλ“œμ˜ λ©”λͺ¨λ¦¬ λ°˜ν™˜ 및 λ…Έλ“œ μ‚­μ œ
  • node = rbtree_min(tree) : RB Tree 의 λ…Έλ“œμ€‘ ν‚€ 값이 κ°€μž₯ μž‘μ€ λ…Έλ“œ λ°˜ν™˜
  • node = rbtree_max(tree) : RB Tree 의 λ…Έλ“œμ€‘ ν‚€ 값이 κ°€μž₯ 큰 λ…Έλ“œ λ°˜ν™˜

ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€

  • test_init()
  • test_rotate()
  • test_insert()
  • test_insert_single(1024)
  • test_find_single(512, 1024)
  • test_erase_root(128)
  • test_minmax_suite()
  • test_to_array_suite()
  • test_distinct_values()
  • test_duplicate_values()
  • test_multi_instance()

νšŒμ „ κ°œμš”

  • RB-TREE-INSERT와 RB-TREE-DELETE의 μ—°μ‚°μ—μ„œ 트리λ₯Ό μˆ˜μ •ν•˜κΈ° λ•Œλ¬Έμ— λ ˆλ“œλΈ”λž™ 트리의 νŠΉμ„±μ„ μœ„λ°˜ν•  수 μžˆλ‹€.
  • λ ˆλ“œ λΈ”λž™μ˜ νŠΉμ„±μ„ λ³΅κ΅¬ν•˜κΈ° μœ„ν•΄ 일뢀 λ…Έλ“œμ˜ 색과 포인터λ₯Ό λ³€κ²½ν•΄μ€˜μ•Ό ν•˜λŠ”λ°, 포인터λ₯Ό λ³€κ²½ν•  λ•Œ νšŒμ „μ΄ μ‚¬μš©λœλ‹€.
  • νšŒμ „μ—λŠ” μ’ŒνšŒμ „κ³Ό μš°νšŒμ „ 두 μ’…λ₯˜κ°€ μžˆλ‹€. μ’ŒνšŒμ „κ³Ό μš°νšŒμ „μ€ μ„œλ‘œ λŒ€μΉ­μ΄λ‹€.
μ’ŒνšŒμ „ μ˜μ‚¬ μ½”λ“œ
LEFT-ROTATE(T, x)
1 y = x.right 
2 x.right = y.left 
3 if y.left != T.nil
4   y.left.p = x
5 y.p = x.p 
6 if x.p == T.nil
7 T.root = y
8 elseif x == x.p.left
9   x.p.left = y
10 else x.p.right = y
11 y.left = x
12 x.p = y

μ‚½μž… κ°œμš”

  • RB-INSERT(T, z) λ₯Ό ν˜ΈμΆœν•˜λ©΄ λ…Έλ“œ zκ°€ RB트리 T 에 μ‚½μž…λœλ‹€.
  • 이진 탐색 트리의 μ‚½μž…μ²˜λŸΌ λ…Έλ“œ zκ°€ λ“€μ–΄κ°ˆ μœ„μΉ˜λ₯Ό νƒμƒ‰ν•˜μ—¬ 트리 T에 μ‚½μž…ν•œ λ’€ μ‚½μž…λœ λ…Έλ“œ Zλ₯Ό λΉ¨κ°„ λ…Έλ“œλ‘œ μΉ ν•œλ‹€.
  • μ‚½μž… 된 μƒˆλ‘œμš΄ 빨간색 λ…Έλ“œλ‘œ 인해 RB 트리의 쑰건을 μœ„λ°˜ν•˜μ˜€μ„ μˆ˜λ„ μžˆμœΌλ―€λ‘œ RB-INSERT-FIXUP(T, z)μ—μ„œ νšŒμ „κ³Ό 색 λ³€ν™˜μ„ 톡해 RB트리의 쑰건을 λ§Œμ‘±ν•  수 μžˆλ„λ‘ ν•œλ‹€.
RB-TREE-INSERT μ˜μ‚¬ μ½”λ“œ
RB-INSERT(T, z)
1 y = T.nil
2 x = T.root
3 while x != T.nil
4   y = x
5   if z.key < x.key
6     x = x.left
7   else x = x.right
8 z.p = y
9 if y == T.nil
10  T.root = z
11 elseif  z.key < y.key
12  y.left = z
13 else y.right = z
14 z.left = T.nil
15 z.right = T.nil
16 z.color = RED
17 RB-INSERT-FIXUP(T, z)
BINARY-TREE-INSERT와 RB-TREE-INSERT 의 차이
  • TREE-INSERT에 λ‚˜νƒ€λ‚˜λŠ” λͺ¨λ“  NIL은 T.nil둜 κ΅μ²΄λœλ‹€.
  • μƒˆλ‘œ μ‚½μž…λ˜λŠ” λ…Έλ“œ z의 left와 rightλŠ” T.nil둜 μ§€μ •λœλ‹€.
  • μƒˆλ‘œ μ‚½μž…λ˜λŠ” λ…Έλ“œ z의 색깔을 λΉ¨κ°„μƒ‰μœΌλ‘œ μΉ ν•œλ‹€.
  • μƒˆλ‘œ μ‚½μž…λ˜λŠ” λ…Έλ“œ z의 색이 λΉ¨κ°„μƒ‰μœΌλ‘œ λ˜λ©΄μ„œ λ ˆλ“œλΈ”λž™νŠΈλ¦¬μ˜ νŠΉμ„±μ„ μœ„λ°˜ν•  수 μžˆμœΌλ―€λ‘œ RB-INSERT-FIXUP(tree, node)λ₯Ό ν˜ΈμΆœν•˜μ—¬ νŠΉμ„±μ„ λ§Œμ‘±ν•  수 μžˆλ„λ‘ ν•œλ‹€.
RB-INSERT-FIXUP(tree, node) 의 λ™μž‘
  • μƒˆλ‘œμš΄ λ…Έλ“œ zκ°€ μ‚½μž…λ˜λ©΄μ„œ λ°œμƒ κ°€λŠ₯ν•œ λ ˆλ“œλΈ”λž™νŠΈλ¦¬ 쑰건의 μœ„λ°˜ 사항
    • 루트 λ…Έλ“œλŠ” 검정색 μ΄μ–΄μ•Όν•œλ‹€.
      • λ…Έλ“œ zκ°€ 루트일 λ•Œ μœ„λ°˜
    • 빨간색 λ…Έλ“œλŠ” 빨간색 μžμ‹μ„ κ°€μ§ˆ 수 μ—†λ‹€.
      • λ…Έλ“œ z의 λΆ€λͺ¨κ°€ 빨간색일 λ•Œ μœ„λ°˜
RB-INSERT-FIXUP μ˜μ‚¬ μ½”λ“œ
RB-INSERT-FIXUP(T, z)
1 while z.p.color == RED
2   if z.p == z.p.p.left
3     y = z.p.p.right
4     if y.color == RED
5       z.p.color = BLACK // case 1
6       y.color = BLACK // case 1
7       z.p.p.color = RED // case 1
8       z = z.p.p // case 1
9     else if z == z.p.right
10        z = z.p // case 2
11        LEFT-ROTATE(T, z)/ // case 2
12      z.p.color = BLACK // case 3
13      z.p.p.color = RED // case 3
14      RIGHT-ROTATE(T, z.p.p) // case 3
15   else (same for z.p as a z.p.p.right subtree) // case 4 ~ 6
16 T.root.color = BLACK
RB-INSERT-FIXUP(tree, node) λ™μž‘ 및 μœ„λ°˜ 경우
  • μƒˆλ‘œμš΄ λ…Έλ“œ zκ°€ μ‚½μž…λ˜λ©΄μ„œ λ°œμƒ κ°€λŠ₯ν•œ λ ˆλ“œλΈ”λž™νŠΈλ¦¬ 쑰건의 μœ„λ°˜ 사항을 ν™•μΈν•˜κ³  각 κ²½μš°μ— λ§žλŠ” λ…Έλ“œμ˜ 색 λ³€κ²½ 및 νšŒμ „μ„ 톡해 λ ˆλ“œλΈ”λž™νŠΈλ¦¬ 쑰건을 λ§Œμ‘±ν•  수 μžˆλ„λ‘ ν•œλ‹€.
    • λ ˆλ“œλΈ”λž™νŠΈλ¦¬μ—μ„œ 루트 λ…Έλ“œλŠ” 검정색 μ΄μ–΄μ•Όν•˜λ―€λ‘œ λ…Έλ“œ zκ°€ 루트일 λ•Œ μœ„λ°˜λœλ‹€.
    • 빨간색 λ…Έλ“œλŠ” 빨간색 μžμ‹μ„ κ°€μ§ˆ 수 μ—†λ‹€.λ…Έλ“œ z의 λΆ€λͺ¨κ°€ 빨간색일 λ•Œ μœ„λ°˜λœλ‹€.
  • 경우 1 : λ…Έλ“œ z의 μ‚Όμ΄Œ yκ°€ 적색인 경우
    • z.p.pλŠ” 흑색이고, z.p 와 yλŠ” μ μƒ‰μ΄λ―€λ‘œ,
      z.p.pλ₯Ό μ μƒ‰μœΌλ‘œ μΉ ν•˜κ³  z.p 와 yλ₯Ό ν‘μƒ‰ν•˜μ—¬ νŠΉμ„± 5λ₯Ό λ§Œμ‘±μ‹œν‚¬ 수 μžˆλ‹€.
    • κ·Έ λ‹€μŒ z.p.pλ₯Ό z둜 μ„€μ •ν•˜μ—¬ μœ„μ˜ 색 λ³€ν™”λ‘œ RBTree 의 μœ„λ°˜ 사항이 μƒκ²ΌλŠ”μ§€ while문을 톡해 λ‹€μ‹œ ν™•μΈν•œλ‹€.
  • 경우 2 : λ…Έλ“œ z의 μ‚Όμ΄Œ yκ°€ 흑색이며 λ…Έλ“œ zκ°€ 였λ₯Έμͺ½ μžμ‹μΈ 경우
    • 경우 2의 경우 LEFT-ROTATE을 톡해 경우 3으둜 λ³€κ²½ν•˜μ—¬ μœ„λ°˜ 사항을 ν•΄κ²°ν•œλ‹€.
  • 경우 3 : λ…Έλ“œ z의 μ‚Όμ΄Œ yκ°€ 흑색이며 λ…Έλ“œ zκ°€ μ™Όμͺ½ μžμ‹μΈ 경우
    • z.p의 색을 κ²€μ •μœΌλ‘œ λ°”κΎΈκ³ , z.p.p의 색을 λΉ¨κ°•μœΌλ‘œ λ°”κΎΌλ’€ RIGHT-ROTATION을 톡해 λ ˆλ“œλΈ”λž™ 트리 μœ„λ°˜ 사항을 ν•΄κ²°ν•œλ‹€.

image

경우 1 ~ 3 은 z의 λΆ€λͺ¨κ°€ μ‘°λΆ€λͺ¨μ˜ μ™Όμͺ½ μ„œλΈŒ 트리일 κ²½μš°μ™€, 였λ₯Έμͺ½ μ„œλΈŒ 트리일 경우둜 λ‚˜λ‰  수 있기 λ•Œλ¬Έμ— 총 6κ°€μ§€μ˜ κ²½μš°κ°€ 생긴닀.

μ‚­μ œ κ°œμš”

  • λ³΄ν†΅μ˜ 이진 탐색 νŠΈλ¦¬μ™€ λΉ„μŠ·ν•˜κ²Œ μ‚­μ œν•œλ‹€. ν•˜μ§€λ§Œ μ‚½μž…κ³Ό 같이 μ‚­μ œ ν›„ κ²½μš°λ“€μ„ λ³΄λ©΄μ„œ λ ˆλ“œλΈ”λž™νŠΈλ¦¬μ˜ νŠΉμ„±μ„ μœ„λ°˜ν•œ 경우 μƒ‰λ³€ν™˜κ³Ό νšŒμ „μ„ 톡해 포인터 변경을 톡해 λ ˆλ“œ λΈ”λž™ 트리의 νŠΉμ§•μ„ λ§Œμ‘±μ‹œν‚¨λ‹€.
  • 기본적으둜 RB Tree의 μ‚­μ œλ₯Ό μ½”λ“œλ‘œ κ΅¬ν˜„ν•  λ•Œ
    • μ‚­μ œν•  λ…Έλ“œ z와 λŒ€μ²΄ λ…Έλ“œ y의 λΆ€λͺ¨, μžμ‹λ“±μ˜ μ—°κ²° 정보λ₯Ό μˆ˜μ •ν•˜λŠ” 방법과
    • λŒ€μ²΄ λ…Έλ“œ y의 ν‚€ 값을 μ›λž˜ μ‚­μ œν•  λ…Έλ“œ z에 볡사 ν›„ λŒ€μ²΄ λ…Έλ“œ yλ₯Ό λŒ€μ‹  μ‚­μ œ μ‹œν‚€λŠ” 방법이 μžˆλŠ”λ°
      μ „μžμ˜ λ°©λ²•μœΌλ‘œ μ‚­μ œλ₯Ό κ΅¬ν˜„ν–ˆλ‹€.
TRANSPLANT(T, u, v) μ˜μ‚¬ μ½”λ“œ
  • TRANSPLANT(T, u, v)λŠ” RB-DELETE(T, z) μ—μ„œ μ‚­μ œν•  λ…Έλ“œ z와 zλ₯Ό λŒ€μ²΄ν•  λ…Έλ“œ y(z보닀 ν‚€ 값이 큰 κ°€μž₯ μž‘μ€ λ…Έλ“œ)의 μ—°κ²° 관계λ₯Ό λ°”κΏ”μ£ΌλŠ” 역할을 ν•œλ‹€.
RB-TRANSPLANT(T, u, v)
1 if u.p == T.nil
2   T.root = v
3 elseif u == u.p.left
4   u.p.left = v
5 else u.p.right = v
6 v.p = u:p
RB-DELETE(T, z) μ˜μ‚¬ μ½”λ“œ
RB-DELETE(T, z)
1 y = z
2 y-original-color = y.color
3 if z.left == T.nil
4     x = z.right
5     RB-TRANSPLANT(T, z, z.right)
6 elseif z.right == T.nil
7     x = z.left
8     RB-TRANSPLANT(T, z, z.left)
9 else y = TREE-MINIMUM(z.right)
10    y-original-color = y.color
11    x = y.right
12    if y.p == z
13        x.p = y
14    else RB-TRANSPLANT(T, y, y.right)
15        y.right = z.right
16        y.right.p = y
17    RB-TRANSPLANT(T, z, y)
18    y.left = z.left
19    y.left.p = y
20    y.color = z.color
21 if y-original-color == BLACK
22    RB-DELETE-FIXUP(T, x)
RB-DELETE-FIXUP(T, x) λ™μž‘ 및 μœ„λ°˜ 경우
  • RB-DELETE(T, z)μ—μ„œ μƒˆλ‘œμš΄ λ…Έλ“œ zκ°€ μ‚­μ œλ˜λ©΄μ„œ λŒ€μ²΄ λ…Έλ“œ yκ°€ λŒ€μ²΄λ˜μ—ˆλ‹€. λ”°λΌμ„œ y->right인 x에 λŒ€ν•΄μ„œ λΆ€λͺ¨λ‘œ μ˜¬λΌκ°€λ©΄μ„œ λ°œμƒ κ°€λŠ₯ν•œ λ ˆλ“œλΈ”λž™νŠΈλ¦¬ 쑰건의 μœ„λ°˜ 사항을 ν™•μΈν•˜κ³  각 κ²½μš°μ— λ§žλŠ” λ…Έλ“œμ˜ 색 λ³€κ²½ 및 νšŒμ „μ„ 톡해 λ ˆλ“œλΈ”λž™νŠΈλ¦¬ 쑰건을 λ§Œμ‘±ν•  수 μžˆλ„λ‘ ν•œλ‹€.

  • λŒ€μ²΄ λ…Έλ“œ y의 μžμ‹ λ…Έλ“œμΈ xλ₯Ό κΈ°μ€€μœΌλ‘œ λΆ€λͺ¨λ…Έλ“œμ™€ μ‚Όμ΄Œ λ…Έλ“œμ˜ 색을 ν™•μΈν•˜λ©° 각 κ²½μš°μ— λ§žλŠ” 색 λ³€ν™˜ 및 νšŒμ „ν•œλ‹€.

  • 경우 1: x의 ν˜•μ œ wκ°€ 적색인 경우

  • 경우 2: x의 ν˜•μ œ wλŠ” 흑색이고 w의 두 μžμ‹μ΄ λͺ¨λ‘ 흑색인 경우

  • 경우 3: x의 ν˜•μ œ wλŠ” 흑색, w의 μ™Όμͺ½ μžμ‹μ€ 적색, w의 였λ₯Έμͺ½ μžμ‹μ€ 흑색인 경우

  • 경우 4: x의 ν˜•μ œ wλŠ” 흑색이고 w의 였λ₯Έμͺ½ μžμ‹μ€ 적색인 경우

경우 1 ~ 4λŠ” λ…Έλ“œ xκ°€ λΆ€λͺ¨μ˜ μ™Όμͺ½ μžμ‹μΌ λ•Œμ˜ κ²½μš°μ΄λ―€λ‘œ 였λ₯Έμͺ½ μžμ‹μΈ κ²½μš°μ— 경우 1 ~ 5κ°€ λŒ€μΉ­μ μœΌλ‘œ λ°œμƒκ°€λŠ₯ ν•˜λ‹€.

RB-DELETE-FIXUP(T, x) μ˜μ‚¬ μ½”λ“œ
1 while x != T.root and x.color == BLACK
2     if x == x.p.left
3         w = x.p.right
4         if w.color == RED
5             w.color = BLACK // case 1
6             x.p.color . RED // case 1
7             LEFT-ROTATE(T, x.p) // case 1
8             w = x.p.right // case 1
9         if w.left.color == BLACK and w.right.color == BLACK
10            w .color = RED // case 2
11            x = x.p // case 2
12        else if w.right.color == BLACK
13                w.left.color = BLACK // case 3
14                w.color = RED // case 3
15                RIGHT-ROTATE(T, w) // case 3
16                w = x.p.right // case 3
17            w.color = x.p.color // case 4
18            x.p.color = BLACK // case 4
19            w.right.color = BLACK // case 4
20            LEFT-ROTATE(T, x.p) // case 4
21            x = T.root // case 4
22    else (same thing for the opossite direction β€œright” and β€œleft” exchanged) // case 5 ~ 8
23 x.color = BLACK

μ°Έκ³ λ¬Έν—Œ


ETC

malloc

  • 인자둜 μ „λ‹¬λœ 크기 만큼 λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήν•œ 후에, κ·Έ λ©”λͺ¨λ¦¬μ˜ μ‹œμž‘ μ£Όμ†Œκ°’μ„ λ°˜ν™˜ν•œλ‹€.
  • ν• λ‹Ήλœ λ©”λͺ¨λ¦¬λŠ” μ΄ˆκΈ°ν™” λ˜μ§€ μ•Šμ•˜μ„ μˆ˜λ„ μžˆλ‹€. (기쑴의 μžˆμ—ˆλ‹¨ λ‚΄μš©μ΄ 남아 μžˆμ„ μˆ˜λ„ μžˆλ‹€)
  • 만일 sizeκ°€ 0 이라면, malloc 이 무엇을 λ¦¬ν„΄ν• μ§€λŠ” κ΅¬ν˜„ν•œ 라이브러리 λ§ˆλ‹€ λ‹€λ₯΄λ‹€. μ–΄λ–€ 경우 널 포인터λ₯Ό 리턴할 μˆ˜λ„ 있고, μ–΄λ–€ 경우, 널이 μ•„λ‹Œ 포인터λ₯Ό λ¦¬ν„΄ν•˜μ§€λ§Œ, μ‚¬μš© λΆˆκ°€λŠ₯ν•œ 뢀뢄을 가리킀고 μžˆμ„ μˆ˜λ„ μžˆλ‹€. μ–΄λ–€ κ²½μš°λ“ , ν•΄λ‹Ή μ£Όμ†Œκ°’μ„ μ‚¬μš©ν•˜λ©΄ μ•ˆλœλ‹€.
  • ν• λ‹Ήλœ λ©”λͺ¨λ¦¬λŠ” λ°˜λ“œμ‹œ free 둜 ν•΄μ œν•΄μ€˜μ•Ό ν•œλ‹€.
  • 인자
    • size : λ©”λͺ¨λ¦¬ λΈ”λ‘μ˜ 크기(λ°”μ΄νŠΈ λ‹¨μœ„)
  • λ°˜ν™˜ κ°’
    • λ©”λͺ¨λ¦¬ 할당에 μ„±κ³΅ν•˜μ˜€μ„ 경우, ν• λ‹Ήν•œ λ©”λͺ¨λ¦¬ 블둝을 κ°€λ¦¬ν‚€λŠ” 포인터λ₯Ό λ¦¬ν„΄ν•œλ‹€. ν•΄λ‹Ή ν¬μΈν„°μ˜ νƒ€μž…μ€ μ–Έμ œλ‚˜ void* μ΄λ―€λ‘œ μ‚¬μš©μžκ°€ μ›ν•˜λŠ” νƒ€μž…μœΌλ‘œ μΊμŠ€νŒ… ν•΄μ€˜μ•Ό ν•œλ‹€.
    • malloc ν•¨μˆ˜κ°€ λ©”λͺ¨λ¦¬ 할당에 μ‹€νŒ¨ν•˜μ˜€μ„ 경우, NULL 포인터λ₯Ό λ¦¬ν„΄ν•œλ‹€.

calloc과 malloc의 차이

  • calloc은 λ™μ μœΌλ‘œ λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήν•˜κ³  ν• λ‹Ήλœ λ©”λͺ¨λ¦¬ 블둝을 0으둜 μ΄ˆκΈ°ν™”ν•œλ‹€.
  • malloc은 λ™μ μœΌλ‘œ λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήν•˜μ§€λ§Œ ν• λ‹Ήλœ λ©”λͺ¨λ¦¬λ₯Ό 0으둜 μ΄ˆκΈ°ν™”ν•˜μ§€μ•ŠλŠ”λ‹€.

profile
https://pyotato-dev.tistory.com/ 둜 이사쀑 πŸššπŸ’¨πŸš›πŸ’¨πŸššπŸ’¨

0개의 λŒ“κΈ€