๐ŸŠ[์ •๊ธ€์ผ์ง€] W05 ํšŒ๊ณ  - ํƒํ—˜์ค€๋น„ w/ Red-Black Tree

์ด๊ฐ•์šฑยท2022๋…„ 10์›” 30์ผ
1

๐ŸŠ ์ •๊ธ€์ผ์ง€

๋ชฉ๋ก ๋ณด๊ธฐ
6/8

์•…์–ด๋–ผ๊ฐ€ ๋‚˜์˜จ๋‹ค ์•…์–ด๋–ผ

์•…์–ด๋•Œ๋ฅผ ๋งŒ๋‚˜๊ธฐ ์ „, ์šฐ๋ฆฌ๋Š” ๋‚˜๋ฆ„์˜ ์ค€๋น„๋ฅผ ํ•ด์•ผํ•œ๋‹ค.
์šฐ๋ฆฌ์˜ ๋ฌด๊ธฐ๋Š” C.

๊ฐ€์žฅ ํ”ํ•˜๊ฒŒ ์ž˜ ์“ฐ์ด๋Š” RB-tree๋ฅผ C์—์„œ ๊ตฌํ˜„ํ•˜๋ฉด์„œ,
ํฌ์ธํ„ฐ / ๊ตฌ์กฐ์ฒด ๊ฐœ๋…์„ ์ตํžˆ๊ณ , ๋””๋ฒ„๊น… ๋ฐฉ๋ฒ•, makeํŒŒ์ผ ์ž‘์„ฑ ๋ฐ ์‹คํ–‰ ๋“ฑ์„ ์ตํ˜”๋‹ค.

why RB-tree

RB-tree ๋Š” ์ด๋ฏธ ํฌ์ŠคํŒ… ํ–ˆ์ง€๋งŒ, ์ฃผ๋กœ RB-tree์˜ ๊ธฐ๋ณธ ๊ฐœ๋…๊ณผ ๊ตฌํ˜„ ๋ฌธ์ œ์— ๊ด€ํ•œ ์ด์Šˆ๋“ค์„ ์ •๋ฆฌํ•ด๋†“์•˜์„ ๋ฟ์ด๋‹ค. ์ด๋ฒˆ ์ฃผ์ฐจ ํ‹ฐํƒ€์ž„์—์„œ (์ฐธ์„ํ•˜์ง„ ์•Š์•˜์ง€๋งŒ) ๋“ค๋ ค์˜ค๋Š” ๋ง๋“ค์— ์˜ํ•˜๋ฉด RB-tree์˜ ๊ตฌํ˜„ ์ž์ฒด๋Š” ์ค‘์š”ํ•œ ์‚ฌํ•ญ์ด ์•„๋‹Œ๋“ฏ ์‹ถ๋‹ค. ์„ค๋ช…์„œ๋ฅผ ๋ณด๊ณ  ๋ฌผ๊ฑด์„ ์กฐ๋ฆฝํ•˜๋“ฏ ๊ตฌํ˜„ ์ž์ฒด๋Š” ์žฌ๋ฐŒ๊ธด ํ–ˆ์œผ๋‚˜, ์—ฌํƒœ๊นŒ์ง€ ๊ฒฝํ—˜ํ•œ ๋ฐ”์— ์˜ํ•˜๋ฉด ํฌ๊ฒŒ ๊ธฐ์–ต์— ๋‚จ์ง€ ์•Š๊ณ  '์ด๋Ÿฐ๊ฑฐ ํ•ด๋ดค๋‹ค' ํ•˜๋Š” ์ž์‹ ๊ฐ ์ด์ƒ์˜ ์˜๋ฏธ๊ฐ€ ์—†์„ ๊ฒƒ๊ฐ™๋‹ค.

๊ทธ๋ž˜์„œ RED-BLACK tree ์™œ ์“ฐ๋Š๋ƒ. ์–ด๋””์„œ ์“ฐ๋Š๋ƒ.

๋’ค ๋Šฆ๊ฒŒ ์ •๋ฆฌํ•ด๋ณด์ž๋ฉด ์ด๋ ‡๋‹ค.

์™œ

'์™œ ์“ฐ๋Š๋ƒ'๋Š” RB-tree์˜ ๋“ฑ์žฅ ๋ฐฐ๊ฒฝ๊ณผ, ๋‹ค๋ฅธ ๊ท ํ˜• ์ด์ง„ ํŠธ๋ฆฌ์™€์˜ ์ฐจ์ด์ ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

  1. ๊ท ํ˜•์„ ์ด๋ฃจ๋Š” ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ์˜ ์‹œ์ž‘์€ AVL(Adel'son-Vel'ski, Landis)ํŠธ๋ฆฌ์˜€๋‹ค. ํŠธ๋ฆฌ ๋‚ด์˜ ์–ด๋–ค ๋…ธ๋“œ์˜ ์™ผ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์™€ ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์˜ ๋†’์ด์ฐจ๊ฐ€ 1์ดํ•˜๊ฐ€ ๋˜๊ฒŒ ์œ ์ง€ํ•จ์œผ๋กœ์จ ๊ท ํ˜•์„ ์žก๋Š”๋‹ค.

  2. ๊ทธ ๋‹ค์Œ์€ 2-3 ํŠธ๋ฆฌ ์™€ B-ํŠธ๋ฆฌ๊ฐ€ ๋“ฑ์žฅํ–ˆ๋‹ค.
    2-3 ํŠธ๋ฆฌ๋Š” ๊ฐ ๋…ธ๋“œ๊ฐ€ (์ž์‹์ด ์žˆ๋Š” ๊ฒฝ์šฐ) 2๊ฐœ์˜ ์ž์‹๊ณผ 1๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ฑฐ๋‚˜, 3๊ฐœ์˜ ์ž์‹๊ณผ 2๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๋Š” ํŠธ๋ฆฌ์ธ๋ฐ ์ด๊ฒƒ์„ ์ผ๋ฐ˜ํ™” ํ•œ ๊ฒƒ์ด B-ํŠธ๋ฆฌ. M์ฐจ B-ํŠธ๋ฆฌ๋Š” ํ•˜๋‚˜์˜ ๋…ธ๋“œ๊ฐ€ ์ตœ๋Œ€ M๊ฐœ์˜ ์ž์‹์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ํŠธ๋ฆฌ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

  3. ์ดํ›„์— '4์ฐจ B-ํŠธ๋ฆฌ'์˜ ์กฐ๊ธˆ ํŠน๋ณ„ํ•œ ๋ฒ„์ „์ธ "๋Œ€์นญ ์ด์ง„ B-ํŠธ๋ฆฌ"(2-3-4 ํŠธ๋ฆฌ)๊ฐ€ ๊ฐœ๋ฐœ๋˜๊ณ ,
    ์ด๋Ÿฌํ•œ '๋Œ€์นญ ์ด์ง„ B-tree'์˜ ๊ฐœ๋…์„ ๊ฐ€์ง€๊ณ , RB-tree๊ฐ€ ํƒ„์ƒํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.
    ์—ฌ๋‹ด์œผ๋กœ ๋…ธ๋“œ์˜ ์ƒ‰๊น”์ด RED์™€ BLACK์ธ ์ด์œ ๋Š” ๋นจ๊ฐ„์ƒ‰์ด ๋‹น์‹œ ๊ฐœ๋ฐœ์ด ์ด๋ฃจ์–ด์กŒ๋˜ ํŒ”๋กœ์•Œํ†  ์—ฐ๊ตฌ์†Œ์˜ ํ”„๋ฆฐํ„ฐ๊ธฐ๊ฐ€ ์ธ์‡„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ์„ ๋ช…ํ•œ ์ƒ‰์ด์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋ผ๊ณ  ํ•œ๋‹ค.

๊ทธ๋ ‡๋‹ด AVL-tree์™€ RB-tree์˜ ์ฐจ์ด์ ์€ ๋ญ˜๊นŒ

AVL ์ด RB๋ณด๋‹ค ๊ท ํ˜• ๊ธฐ์ค€์ด ์—„๊ฒฉ
( ๊ท ํ˜•์ธ์ˆ˜์˜ ์ฐจ์ด๊ฐ€ 2๋งŒ ๋‚˜๋„ ์ฆ‰ ์ขŒ์šฐ ๋†’์ด์ฐจ๊ฐ€ 2๋งŒ ๋‚˜๋„ ์žฌ์กฐ์ •)
- ๊ฑฐ์˜ ๋ชจ๋“  ๊ฒฝ์šฐ์— ์กฐํšŒ๋ฅผ logn์— ํ•  ์ˆ˜ ์žˆ์Œ
- ๋‹จ ๊ท ํ˜• ์กฐ์ •์ด ์—„๊ฒฉํ•ด์„œ, ์กฐ์ •ํ•  ์ผ์ด ๋งŽ์„ ๊ฒƒ์ด๊ณ  ๊ทธ์— ๋”ฐ๋ผ ์‚ฝ์ž…๊ณผ ์‚ญ์ œ๊ฐ€ ๋น„์šฉ์ด ๋งŽ์ด ๋“ฆ

RB๋Š” AVL๋ณด๋‹ค ๊ท ํ˜•์ด ๋œ ์—„๊ฒฉ
(๋ฃจํŠธ์—์„œ ๋ฆฌํ”„๊นŒ์ง€ ๊ฐ€๋Š” ๋ชจ๋“  ๊ฒฝ๋กœ์˜ ํ‘์ƒ‰๋…ธ๋“œ์˜ ์ˆ˜๋งŒ ๊ฐ™์œผ๋ฉด ๋จ)
- ๊ท ํ˜•์ด ๋งŽ์ด ๊นจ์ง„ ๊ฒฝ์šฐ์—” ์กฐํšŒ๊ฐ€ logn๋ณด๋‹ค ๋งŽ์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Œ (๊ทธ๋ฆผ์ฒ˜๋Ÿผ ๊ฒฝ๋กœ ๊ธธ์ด ์ตœ๋Œ€ 2๋ฐฐ ๊ฐ€๊นŒ์ด ์ฐจ์ด ๋‚  ์ˆ˜ ์žˆ์Œ)
- ๋‹จ, ๊ท ํ˜• ์กฐ์ •์ด ๋„๋„ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์‚ฝ์ž… ์‚ญ์ œ ๋น„์šฉ์ด ๋œํ•˜๋‹ค


๊ทธ๋Ÿฌํ•˜๋‹ค.
์‹ค์ œ๋ก  RB-tree๊ฐ€ ์ข€๋” ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค๊ณ  ํ•œ๋‹ค. ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ RB-tree๊ฐ€ ์‚ฝ์ž…, ์‚ญ์ œ, ์กฐํšŒ์—์„œ ๋น„๊ต์  ์ข‹์€ ์„ฑ๋Šฅ์„ ๋ณด์ด์ง€๋งŒ, ๋น ๋ฅธ ์กฐํšŒ๋ฅผ ์œ„ํ•ด์„  AVLํŠธ๋ฆฌ๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค.

๋‹ค์Œ์€ RB-tree๊ฐ€ ์‹ค์ œ๋กœ ํ™œ์šฉ๋˜๋Š” ์˜ˆ์‹œ๋‹ค.

์–ด๋””์—

Java: java.util.TreeMap, java.util.TreeSet
C++ STL (in most implementations): map, multimap, multiset
Linux kernel: completely fair scheduler, linux/rbtree.h


์†Œ๊ฐ

์—ญ์‹œ ์žฌ๋ฐŒ์—ˆ๋‹ค. ํŠนํžˆ ์ด๋ฒˆ์ฃผ๋Š” ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŒ… ํ•˜๋Š” ์žฌ๋ฏธ๋ฅผ ์กฐ๊ธˆ ์•Œ๊ฒŒ ๋œ ๊ฒƒ ๊ฐ™๋‹ค.
๋ธ”๋กœ๊ทธ๋Š” ํ”ผ๋“œ๋ฐฑ์ด ์ƒ๋ช…์ธ๊ฑฐ ๊ฐ™๋‹ค. ๋ฟŒ๋“ฏํ–ˆ๋‹ค.

ํ•œ๋ฒˆ ๋” ํ›„ํšŒ์—†๋Š” ํ•œ ์ฃผ๊ฐ€ ๋˜๊ธธ

profile
I think I think too much.

4๊ฐœ์˜ ๋Œ“๊ธ€

comment-user-thumbnail
2022๋…„ 10์›” 30์ผ

์–ด๋””์— ์“ฐ๋Š” ์ง€, ์™œ ์“ฐ๋Š” ์ง€๋ฅผ ๋นผ๋จน๊ณ  ๊ตฌํ˜„์—๋งŒ ์‹ ๊ฒฝ ์ผ๋˜ ๋‚˜ ์ž์‹ ์— ๋ฐ˜์„ฑํ•ฉ๋‹ˆ๋‹ค!!

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2022๋…„ 10์›” 31์ผ

์ด์ œ ๋Šช์ง€๋Œ€์ธ๊ฐ€์š”?

1๊ฐœ์˜ ๋‹ต๊ธ€