๋ฌธ์ ์ํฉ : ํ์ค์ธ๊ณ์์๋ ์๋ฒฝํ๊ฒ ์ ๋ ฌ๋ Binary Search Tree๋ ์ฐพ๊ธฐ ํ๋ค๋ค. ์ค๋ฅธ์ชฝ์ผ๋ก ๊ทน๋จ์ ์ผ๋ก ์น์ฐ์น ๊ฒฝ์ฐ๊ฐ ์กด์ฌํ ์ ์๋ค.
๋ณด์ ๋ฐฉ๋ฒ : ๋ ๋๋ธ๋ํธ๋ฆฌ(Red-Black Tree)๋ ์ด๋ฅผ ๋ณด์ํ๊ธฐ ์ํด ๋ฑ์ฅํ๋ค.
์๋ฒฝํ๊ฒ ํธ๋ฆฌ์ ๊ท ํ์ ๋ง์ถ ์๋ ์์ผ๋, ์ด๋์ ๋ ๋ณด์์ ๊ฐ๋ฅํ๊ฒ ํ๋ค.
INSERT, DELETE ์๊ณ ๋ฆฌ์ฆ์ ์ ์ ํ๊ฒ ์์ ํ๋ค.
- ๋ ๋๋ธ๋ํธ๋ฆฌ
- ์ด์งํ์ํธ๋ฆฌ์ ์ผ์ข
- ๊ท ํ ์กํ ํธ๋ฆฌ : ๋์ด๊ฐ O(log2n)
- SEARCH, INSERT, DELETE ์ฐ์ฐ์ ์ต์ ์ ๊ฒฝ์ฐ์๋ O(log2n) ์๊ฐ์ ์ง์ํ๋ค.
- ๊ฐ ๋ ธ๋๋ ํ๋์ ํค(key), ์ผ์ชฝ์์(left), ์ค๋ฅธ์ชฝ ์์(right), ๊ทธ๋ฆฌ๊ณ ๋ถ๋ชจ๋ ธ๋(p)์ ์ฃผ์๋ฅผ ์ ์ฅํ๋ค.
- ์์๋ ธ๋๊ฐ ์กด์ฌํ์ง ์์ ๊ฒฝ์ฐ, NIL ๋ ธ๋๋ผ๊ณ ๋ถ๋ฅด๋ ํน์ํ ๋ ธ๋๊ฐ ์๋ค๊ณ ๊ฐ์ ํ๋ค.
- ๋ฐ๋ผ์ ๋ชจ๋ ๋ฆฌํ๋ ธ๋๋ NIL๋ ธ๋์ด๋ค.
- ๋ฃจํธ์ ๋ถ๋ชจ๋ NIL๋ ธ๋๋ผ๊ณ ๊ฐ์ ํ๋ค.
- ๋ ธ๋๋ค์ ๋ด๋ถ๋ ธ๋์ NIL๋ ธ๋๋ก ๋ถ๋ฅํ๋ค.
(NIL๋ ธ๋๋ ๊ฐ์์ ์ธ ๋ ธ๋์. ์ค์ ๋ก ๊ตฌํํ์ง๋ ์๋๋ค.)
- ๋ค์์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์ด์งํ์ํธ๋ฆฌ
1. ๊ฐ ๋ ธ๋๋ red ํน์ black์ด๊ณ ,
2. ๋ฃจํธ๋ ธ๋๋ black์ด๊ณ ,
3. ๋ชจ๋ ๋ฆฌํ๋ ธ๋(์ฆ, NIL๋ ธ๋)๋ black์ด๊ณ ,
4. red๋ ธ๋์ ์์๋ ธ๋๋ค์ ์ ๋ถ black์ด๊ณ (์ฆ, red๋ ธ๋๋ ์ฐ์๋์ด ๋ฑ์ฅํ์ง ์๊ณ ),
5. ๋ชจ๋ ๋ ธ๋์ ๋ํด์ ๊ทธ ๋ ธ๋๋ก๋ถํฐ ์์์ธ ๋ฆฌํ๋ ธ๋์ ์ด๋ฅด๋ ๋ชจ๋ ๊ฒฝ๋ก์๋ ๋์ผํ ๊ฐฏ์์ black๋ ธ๋๊ฐ ์กด์ฌํ๋ค.
- ๋์ด๊ฐ h์ธ ๋ธ๋-๋์ด๋ bh >= h/2 ์ด๋ค.
- ์กฐ๊ฑด4์ ์ํด ๋ ๋๋ ธ๋๋ ์ฐ์๋ ์ ์์ผ๋ฏ๋ก ๋น์ฐํ๋ค.
- ๋ ธ๋ x๋ฅผ ๋ฃจํธ๋ก ํ๋ ์์ด์ ๋ถํธ๋ฆฌ๋ ์ ์ด๋ 2^(bh(x)) -1๊ฐ์ ๋ด๋ถ๋ ธ๋๋ฅผ ํฌํจํ๋ค.(์ํ์ ๊ท๋ฉ๋ฒ)
- n๊ฐ์ ๋ด๋ถ๋ ธ๋๋ฅผ ๊ฐ์ง๋ ๋ ๋๋ธ๋ํธ๋ฆฌ์ ๋์ด๋ 2log2(n+1) ์ดํ์ด๋ค.
- n >= 2^(bh) -1 >= 2^(h/2) -1 ์ด๋ฏ๋ก, ์ฌ๊ธฐ์์ bh์ h๋ ๊ฐ๊ฐ ๋ฃจํธ๋ ธ๋์ ๋ธ๋-๋์ด์ ๋์ด
- ๋ ๋๋ธ๋ํธ๋ฆฌ์ SEARCH, INSERT, DELETE
SEARCH ์๊ณ ๋ฆฌ์ฆ์ Binary Search Tree์ ์๋ฒฝํ ๋์ผํ๋ค.
INSERT์ DELETE๋ฅผ ๋ฐฐ์ ๋ณผ ๊ฑด๋ฐ, Left and Right Rotation์ด๋ผ๋ ์ฌ์ ์ง์์ด ํ์ํ๋ค.
- Left and Right Rotation
- ์๊ฐ๋ณต์ก๋ O(1)
- ์ด์งํ์ํธ๋ฆฌ์ ํน์ฑ์ ์ ์ง
LEFT-ROTATE(T, x) // T : Tree, x : node
{
y <- right[x] // Set y
right[x] <- left[y] // Turn y's left subtree into x's right subtree
p[left[y]] <- x
p[y] <- p[x] // Link x's parent to y. x์ ๋ถ๋ชจ๊ฐ y์ ๋ถ๋ชจ
if p[x] == nil[T] // ํ์ฌ x์ ๋ถ๋ชจ๊ฐ nil์ด๋ผ๋ฉด,
then root[T] <- y // y๊ฐ ์๋ก์ด ํธ๋ฆฌ์ ๋ฃจํธ๊ฐ ๋๋ค
else if x == left[p[x]] // x์ ๋ถ๋ชจ๋
ธ๋๊ฐ ์ค์ ๋ก ์กด์ฌํ๋ค๋ฉด,
then left[p[x]] <- y // y๊ฐ x์ ์ผ์ชฝ์์์ด๋ค
else right[p[x]] <- y // y๊ฐ x์ ์๋ก์ด ์ค๋ฅธ์ชฝ ์์์ด๋ผ๋ฉด,
left[y] <- x // Put x on y's left. x๊ฐ y์ ์ผ์ชฝ์์์ด๋ค
p[x] <- y // x์ ๋ถ๋ชจ๊ฐ y๊ฐ ๋๋ค
}
y = right[x] != NIL์ด๋ผ๊ณ ๊ฐ์ ํ๋ค.
๋ฃจํธ๋ ธ๋์ ๋ถ๋ชจ๋ NIL์ด๋ผ๊ณ ๊ฐ์ ํ๋ค.
'์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
13-1๊ฐ. ํด์(Hashing) 1 (0) | 2020.11.24 |
---|---|
12-2๊ฐ. ๋ ๋๋ธ๋ํธ๋ฆฌ (3) (0) | 2020.11.22 |
11-3๊ฐ. ์ด์ง๊ฒ์ํธ๋ฆฌ (Binary Search Tree) (3) | 2020.11.15 |
์ 11-1๊ฐ. ์ด์ง๊ฒ์ํธ๋ฆฌ(Binary Search Tree) (0) | 2020.11.10 |
์ 10๊ฐ ํธ๋ฆฌ์ ์ด์งํธ๋ฆฌ (0) | 2020.11.08 |
๋๊ธ