๐Ÿ“ฆ cityzenKIM / red-black-tree

๐Ÿ“„ README.md ยท 45 lines
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45# Red-Black Tree ๊ตฌํ˜„

Balanced search tree๋กœ ๋งŽ์ด ์“ฐ์ด๋Š” Red-black tree (์ดํ•˜ RB tree)๋ฅผ C ์–ธ์–ด๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ณผ์ œ์ž…๋‹ˆ๋‹ค.
๊ตฌํ˜„ํ•˜๋Š” ์ถ”์ƒ ์ž๋ฃŒํ˜• (ADT: abstract data type)์€ ordered set, multiset ์ž…๋‹ˆ๋‹ค.

## ๊ตฌํ˜„ ๋ฒ”์œ„
๋‹ค์Œ ๊ธฐ๋Šฅ๋“ค์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก RB tree๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

- tree = `new_tree()`: RB tree ๊ตฌ์กฐ์ฒด ์ƒ์„ฑ
  - ์—ฌ๋Ÿฌ ๊ฐœ์˜ tree๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๋ฉฐ ๊ฐ๊ฐ ๋‹ค๋ฅธ ๋‚ด์šฉ๋“ค์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
- `delete_tree(tree)`: RB tree ๊ตฌ์กฐ์ฒด๊ฐ€ ์ฐจ์ง€ํ–ˆ๋˜ ๋ฉ”๋ชจ๋ฆฌ ๋ฐ˜ํ™˜
  - ํ•ด๋‹น tree๊ฐ€ ์‚ฌ์šฉํ–ˆ๋˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ „๋ถ€ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. (valgrind๋กœ ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์•„์•ผ ํ•จ)

- `tree_insert(tree, key)`: key ์ถ”๊ฐ€
  - ๊ตฌํ˜„ํ•˜๋Š” ADT๊ฐ€ multiset์ด๋ฏ€๋กœ ์ด๋ฏธ ๊ฐ™์€ key์˜ ๊ฐ’์ด ์กด์žฌํ•ด๋„ ํ•˜๋‚˜ ๋” ์ถ”๊ฐ€ ํ•ฉ๋‹ˆ๋‹ค.
- ptr = `tree_find(tree, key)`
  - RB tree๋‚ด์— ํ•ด๋‹น key๊ฐ€ ์žˆ๋Š”์ง€ ํƒ์ƒ‰ํ•˜์—ฌ ์žˆ์œผ๋ฉด ํ•ด๋‹น node pointer ๋ฐ˜ํ™˜
  - ํ•ด๋‹นํ•˜๋Š” node๊ฐ€ ์—†์œผ๋ฉด NULL ๋ฐ˜ํ™˜
- `tree_erase(tree, ptr)`: RB tree ๋‚ด๋ถ€์˜ ptr๋กœ ์ง€์ •๋œ node๋ฅผ ์‚ญ์ œํ•˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ ๋ฐ˜ํ™˜
- ptr = `tree_min(tree)`: RB tree ์ค‘ ์ตœ์†Œ ๊ฐ’์„ ๊ฐ€์ง„ node pointer ๋ฐ˜ํ™˜
- ptr = `tree_max(tree)`: ์ตœ๋Œ€๊ฐ’์„ ๊ฐ€์ง„ node pointer ๋ฐ˜ํ™˜

- `tree_to_array(tree, array, n)`
  - RB tree์˜ ๋‚ด์šฉ์„ *key ์ˆœ์„œ๋Œ€๋กœ* ์ฃผ์–ด์ง„ array๋กœ ๋ณ€ํ™˜
  - array์˜ ํฌ๊ธฐ๋Š” n์œผ๋กœ ์ฃผ์–ด์ง€๋ฉฐ tree์˜ ํฌ๊ธฐ๊ฐ€ n ๋ณด๋‹ค ํฐ ๊ฒฝ์šฐ์—๋Š” ์ˆœ์„œ๋Œ€๋กœ n๊ฐœ ๊นŒ์ง€๋งŒ ๋ณ€ํ™˜
  - array์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์€ ์ด ํ•จ์ˆ˜๋ฅผ ๋ถ€๋ฅด๋Š” ์ชฝ์—์„œ ์ค€๋น„ํ•˜๊ณ  ๊ทธ ํฌ๊ธฐ๋ฅผ n์œผ๋กœ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.

## ๊ตฌํ˜„ ๊ทœ์น™
- `src/rbtree.c` ์ด์™ธ์—๋Š” ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  test๋ฅผ ํ†ต๊ณผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
- `make test`๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ `Passed All tests!`๋ผ๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ๋‚˜์˜ค๋ฉด ๋ชจ๋“  test๋ฅผ ํ†ต๊ณผํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
- Sentinel node๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ–ˆ๋‹ค๋ฉด `test/Makefile`์—์„œ `CFLAGS` ๋ณ€์ˆ˜์— `-DSENTINEL`์ด ์ถ”๊ฐ€๋˜๋„๋ก comment๋ฅผ ์ œ๊ฑฐํ•ด ์ค๋‹ˆ๋‹ค.

## ๊ณผ์ œ์˜ ์˜๋„ (Motivation)

- ๋ณต์žกํ•œ ์ž๋ฃŒ๊ตฌ์กฐ(data structure)๋ฅผ ๊ตฌํ˜„ํ•ด ๋ด„์œผ๋กœ์จ ์ž์‹ ๊ฐ ์ƒ์Šน
- C ์–ธ์–ด, ํŠนํžˆ ํฌ์ธํ„ฐ(pointer)์™€ malloc, free ๋“ฑ์˜ system call์— ์ต์ˆ™ํ•ด์ง.
- ๋™์  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น(dynamic memory allocation)์„ ์ง์ ‘ ์‚ฌ์šฉํ•ด ๋ด„์œผ๋กœ์จ ๋™์  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์˜ ํ•„์š”์„ฑ ์ฒด๊ฐ ๋ฐ data segment์— ๋Œ€ํ•œ ์ดํ•ด๋„ ์ƒ์Šน
- ๊ณ ๊ธ‰ ์–ธ์–ด์—์„œ ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณต๋˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๊ฐ€ ์„ธ๋ถ€์ ์œผ๋กœ๋Š” ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„๋˜์–ด ์žˆ๋Š”์ง€ ๊ฒฝํ—˜ํ•จ์œผ๋กœ์จ ๊ณ ๊ธ‰ ์–ธ์–ด ์‚ฌ์šฉ์‹œ์—๋„ ํšจ์œจ์„ฑ ๊ณ ๋ ค

## ์ฐธ๊ณ ๋ฌธํ—Œ
- [์œ„ํ‚ค๋ฐฑ๊ณผ: ๋ ˆ๋“œ-๋ธ”๋ž™ ํŠธ๋ฆฌ](https://ko.wikipedia.org/wiki/%EB%A0%88%EB%93%9C-%EB%B8%94%EB%9E%99_%ED%8A%B8%EB%A6%AC)
([์˜์–ด](https://en.wikipedia.org/wiki/Red%E2%80%93black_tree))
- CLRS book (Introduction to Algorithms) 13์žฅ ๋ ˆ๋“œ ๋ธ”๋ž™ ํŠธ๋ฆฌ - Sentinel node๋ฅผ ์‚ฌ์šฉํ•œ ๊ตฌํ˜„
- [Wikipedia:๊ท ํ˜• ์ด์ง„ ํŠธ๋ฆฌ์˜ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•๋“ค](https://en.wikipedia.org/wiki/Self-balancing_binary_search_tree#Implementations)