BST์ ๋ฌธ์ ์
์ผ๋ฐ์ ์ธ BST(์ด์ง ๊ฒ์ ํธ๋ฆฌ)๋ ๋ฐ์ดํฐ๊ฐ ์ฝ์ ๋๋ ์์์ ๋ฐ๋ผ ํ์ชฝ์ผ๋ก ํธํฅ๋๋ ํํ๋ก ํธ๋ฆฌ๊ฐ ํ์ฑ๋ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด ์ ๋ ฅ์ด์ด 50 -> 30 -> 100 -> 20 -> 150 ์ธ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๊ทธ๋ฌ๋ ์ ๋ ฅ์ด์ด 20 -> 30 -> 50 -> 100 -> 150 ์ธ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ด๋ ๊ฒ BST๋ ํธ๋ฆฌ์ ๋์ด๋ฅผ $log(n)$ ์ผ๋ก ๋ณด์ฅ๋ฐ์ง ๋ชปํ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค.
ํธ๋ฆฌ์์์ ์ฑ๋ฅ์ ํธ๋ฆฌ์ ๋์ด์ ์ฐ๊ด๋์ด ์์ต๋๋ค.
์ฆ ํธ๋ฆฌ์ ๋์ด๊ฐ $log(n)$์ ๋ณด์ฅ๋ฐ์ง ๋ชปํ๋ค๋ฉด, BST์ ์ฝ์ ๊ณผ ์ญ์ , ๊ฒ์์ ์ฐ์ฐ ์ญ์ ์๊ฐ๋ณต์ก๋ $O(log(n))$์ ๋ณด์ฅ๋ฐ์ง ๋ชปํฉ๋๋ค.
AVL ํธ๋ฆฌ
AVL ํธ๋ฆฌ๋ ์ด์ง ๊ฒ์ ํธ๋ฆฌ(BST)์ ํ๊ฐ์ง ์ข ๋ฅ๋ก์จ ์ค์ค๋ก ๋์ด์ ๊ท ํ์ ์ก๋ ํธ๋ฆฌ์ ๋๋ค.
AVL ํธ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์ต์ ์ ๊ฒฝ์ฐ์๋ ํธ๋ฆฌ์ ๋์ด๋ $O(log(n))$์ ๋ณด์ฅ๋ฐ์ ์ ์๊ฒ ๋์ด,
์ญ์ , ์ฝ์ , ๊ฒ์๋ฑ์ ์์ ์์ ์์๋ณต์ก๋ $O(log(n))$์ ๋ณด์ฅ๋ฐ์ ์ ์๋ ํธ๋ฆฌ์ ๋๋ค.
AVL ํธ๋ฆฌ๋ Balance Factor๋ฅผ ํตํด ๊ท ํ์ ์ ์งํฉ๋๋ค.
AVL ํธ๋ฆฌ์ ๋ชจ๋ ๋ ธ๋๋ค์ Balance Factor์ ๊ฐ์ -1, 0, 1์ค์ ํ๋์ ๋๋ค.
Balance Factor
์์์ ๋ ธ๋ x์ ๋ํ์ฌ
x์ ์ผ์ชฝ ์๋ธํธ๋ฆฌ์ ๋์ด($h_L$)์์ ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ์ ๋์ด($h_R$)๋ฅผ ๋บ ๊ฐ์ Balance Factor๋ก ์ ์ํฉ๋๋ค.
$$BF(x) = h_L(x) - h_R(x)$$
BF๊ฐ $|BF| \geq 2$ ์ธ ๊ฒฝ์ฐ, ํธ๋ฆฌ๋ ๋ถ๊ท ํํ๋ค๊ณ ํ๋จํฉ๋๋ค.
๋ถ๊ท ํ ํธ๋ฆฌ
Leaf Node์ ๋์ด๋ 1์ด๋ผ ํ๊ฒ ์ต๋๋ค.
์์ ๊ฐ์ ์ํฉ์์ AVL ํธ๋ฆฌ๋ ํ์ ์ ํตํด ๊ท ํ์ ๋ง์ถฅ๋๋ค.
๊ท ํ์ ๋ง์ถ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ธฐ ์ ์ AVLํธ๋ฆฌ์ ๋์ด๊ฐ $O(log(n))$์ด ๋ณด์ฅ๋๋ ์๋ฆฌ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
AVL ํธ๋ฆฌ์ ๋์ด(Height)
์ฐ์ ๋์ด๊ฐ h์ธ AVLํธ๋ฆฌ๊ฐ ๊ฐ์ง ์ ์๋ ์ต์ํ์ ๋ ธ๋ ์๋ฅผ ์๊ฐํด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
์ต์ํ์ ๋ ธ๋ ์๋ฅผ $N_h$ ๋ผ ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
$$N_h=\left\{\begin{matrix} 0 & h=0\\ 1& h=1\\ N_{h-1} + N_{h-2} + 1& h \geq 2\\ \end{matrix}\right.$$
์ด์ Fibonacci Tree๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์ฃผ์ด์ง ๋์ด๋ฅผ ๊ฐ์ง AVLํธ๋ฆฌ ์ค ์ต์์ ๋ ธ๋ ๊ฐ์๋ฅผ ๊ฐ๋ ํธ๋ฆฌ๋ฅผ Fibonacci Tree๋ผ ํฉ๋๋ค.
Fibonacci Tree์ ๋ ธ๋ ์์ Fibonacci ์์ ๊ด๊ณ
๋์ด๊ฐ h์ธ Fibonacci Tree์ ๋ ธ๋ ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
$$N_h=\left\{\begin{matrix} 0 & h=0\\ 1& h=1\\ N_{h-1} + N_{h-2} + 1& h \geq 2\\ \end{matrix}\right.$$
n๋ฒ์งธ Fibonacci ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
$$F_h=\left\{\begin{matrix} 0 & n=0\\ 1& n=1\\ F_{h-1} + F_{h-2} & h \geq 2\\ \end{matrix}\right.$$
์ด ๋ ์ฌ์ด์๋ ๋ค์ ๊ด๊ณ์์ด ์ฑ๋ฆฝํฉ๋๋ค.
$$N_h = F_{h+2} - 1 $$
Fibonacci Tree์ ๋์ด
ํผ๋ณด๋์น ์ $F_h$๋ ๋ค์์ ๊ทผ์ฌํจ์ด ์๋ ค์ ธ ์์ต๋๋ค.
$$F_h \approx \phi^{h} / \sqrt{5} \;\;\;\;\;\;\;\; \phi = (1 + \sqrt{5})/2$$
Fibonacci Tree์ ๋ ธ๋ ์์ Fibonacci ์์ ๊ด๊ณ์์ ํตํด ๋ค์์ด ์ฑ๋ฆฝํฉ๋๋ค.
$$N_h = F_{h+2} - 1 \approx (\phi^{h+2} / \sqrt{5})-1$$
N_h๋ฅผ n์ด๋ผ ํ๊ฒ ์ต๋๋ค.
$$(\phi^{h+2} / \sqrt{5})-1 = n$$
$$\phi^{h+2} = \sqrt{5} (n+1)$$
$$ h + 2 = log_{\phi}(\sqrt{5} (n+1))$$
$$ h = log_{\phi}(\sqrt{5} (n+1)) - 2 = O(lon (n))$$
Fibonacci ํธ๋ฆฌ๋ ์ฃผ์ด์ง ๋์ด์ ๋ํด ์ต์ํ์ ๋ ธ๋ ์๋ฅผ ๊ฐ์ง๋ค๊ณ ํ์์ต๋๋ค.
์ด๋ ์ฆ ์ฃผ์ด์ง ๋ ธ๋์๊ฐ ๊ฐ์ง ์ ์๋ ์ต๋ ๋์ด๋ฅผ ๊ฐ์ง๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
n์ ๋์ด๊ฐ h์ธ AVL ํธ๋ฆฌ๊ฐ ๊ฐ์ง ๋ ธ๋ ์๋ผ๊ณ ํ๊ฒ ์ต๋๋ค.
๋์ด h์ธ Full Binary Tree๊ฐ ๊ฐ์ง ์ ์๋ ๋ ธ๋์ ์ด ๊ฐ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
$$2^{h} - 1$$
๊ทธ๋ฆฌ๊ณ ๋์ด๊ฐ h์ธ AVL ํธ๋ฆฌ๊ฐ ๊ฐ์ง ์ ์๋ ์ต์ ๋ ธ๋์ ๊ฐ์, ์ฆ ๋์ด h์ธ Fibonacci Tree์ ๋ ธ๋์ ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
$$N_h \approx (\phi^{h+2} / \sqrt{5})-1 $$
n๋ ๋ค์ ๋ฒ์์ ์ํฉ๋๋ค.
$$N_h \leq n \leq 2^{h} - 1$$
$$if(n == (2^{h} - 1)), \;\; 2^h = n + 1 \; \to \; h =O(log(n))$$
$$if(n == N_h ) \; \to \; h =O(log(n))$$
๋ฐ๋ผ์ h๋ $O(log(n))$์ด ๋ณด์ฅ๋ฉ๋๋ค.
๋ถ๊ท ํ ๋ฌธ์
๋ค์๊ณผ ๊ฐ์ 4๊ฐ์ง ์ข ๋ฅ๊ฐ ์์ต๋๋ค.
- LL ๋ฌธ์
- RR ๋ฌธ์
- LR ๋ฌธ์
- RL ๋ฌธ์
LL๋ฌธ์
์ฝ์ ๋๋ ์ญ์ ๋ก ์ธํด Left-Left๋ก ์๋ธ ํธ๋ฆฌ๊ฐ ๋น๋ํด์ง๋ ๊ฒ์ LL๋ฌธ์ ๋ผ ํฉ๋๋ค.
RR๋ฌธ์
์ฝ์ ๋๋ ์ญ์ ๋ก ์ธํด Right-Right๋ก ์๋ธ ํธ๋ฆฌ๊ฐ ๋น๋ํด์ง๋ ๊ฒ์ RR๋ฌธ์ ๋ผ ํฉ๋๋ค.
LR๋ฌธ์
์ฝ์ ๋๋ ์ญ์ ๋ก ์ธํด Left-Right๋ก ์๋ธ ํธ๋ฆฌ๊ฐ ๋น๋ํด์ง๋ ๊ฒ์ LR๋ฌธ์ ๋ผ ํฉ๋๋ค.
RL๋ฌธ์
์ฝ์ ๋๋ ์ญ์ ๋ก ์ธํด Right-Left๋ก ์๋ธ ํธ๋ฆฌ๊ฐ ๋น๋ํด์ง๋ ๊ฒ์ RL๋ฌธ์ ๋ผ ํฉ๋๋ค.
AVL ํธ๋ฆฌ์ ํ์
๋ค์๊ณผ ๊ฐ์ 4๊ฐ์ง ์ข ๋ฅ๊ฐ ์์ต๋๋ค.
- LL ํ์
- RR ํ์
- LR ํ์
- RL ํ์
ํ์ ํ๋ ๋์ ํ์ ์ ์ค์ฌ์ด ๋๋ ๋ ธ๋์ left, right ์๋ธํธ๋ฆฌ ๊ด๊ณ๋ฅผ ์ ์งํด์ฃผ์ด์ผ ํฉ๋๋ค.
์ฆ left์ ์กด์ฌํ ๊ฒ์ ํ์ ์ดํ์๋ left,
์ฆ right์ ์กด์ฌํ ๊ฒ์ ํ์ ์ดํ์๋ right์ ์กด์ฌํด์ผ ํฉ๋๋ค.
LL ํ์
LL๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ํ์ ์ ๋๋ค.
LL ํ์ ์ ๋ ธ๋์ Balance Factor๊ฐ 2์ผ๋, ๊ทธ ์ข์ธก ์๋ธํธ๋ฆฌ์ ๋ฃจํธ๋ ธ๋์ BF๊ฐ 1์ธ ๊ฒฝ์ฐ ๊ท ํ์ ๋ง์ถ๊ธฐ ์ํ ํ์ ์ ๋๋ค.
LL ํ์ ์ ์ค๋ฅธ์ชฝ์ผ๋ก ๋๋ฆฌ๋ ์์ ์ ๋๋ค.
BF๊ฐ 2์ธ ๋ ธ๋์ ์ผ์ชฝ ์๋ธํธ๋ฆฌ๋ฅผ ๋ฃจํธ ๋ ธ๋๋ก ๋ง๋ค๋ฉด์,
์ผ์ชฝ ์๋ธํธ๋ฆฌ์ ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ๋ฅผ ๊ธฐ์กด ๋ฃจํธ์ ์ผ์ชฝ ์๋ธํธ๋ฆฌ์ ์ฝ์ ํฉ๋๋ค.
์ข ๋ ๊ฐ๋จํ๊ฒ ์๊ฐํ๋ฉด, ๊ฐ์ด๋ฐ ๋ ธ๋๋ฅผ ๊ฐ์ฅ ์๋ก ์ฌ๋ ค์ฃผ๋ ์์ ์ ํ๋ฉด ๋ฉ๋๋ค.
RR ํ์
RR๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ํ์ ์ ๋๋ค.
RR ํ์ ์ ๋ ธ๋์ Balance Factor๊ฐ -2์ผ๋, ๊ทธ ์ฐ์ธก ์๋ธํธ๋ฆฌ์ ๋ฃจํธ๋ ธ๋๊ฐ -1์ธ ๊ฒฝ์ฐ ๊ท ํ์ ๋ง์ถ๊ธฐ ์ํ ํ์ ์ ๋๋ค.
RR ํ์ ์ ์ผ์ชฝ์ผ๋ก ๋๋ฆฌ๋ ์์ ์ ๋๋ค.
BF๊ฐ -2์ธ ๋ ธ๋์ ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ๋ฅผ ๋ฃจํธ ๋ ธ๋๋ก ๋ง๋ค๋ฉด์,
์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ์ ์ผ์ชฝ ์๋ธํธ๋ฆฌ๋ฅผ ๊ธฐ์กด ๋ฃจํธ์ ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ์ ์ฝ์ ํฉ๋๋ค.
RL ํ์
RL๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ํ์ ์ ๋๋ค.
RL ํ์ ์ ๋ ธ๋์ Balance Factor๊ฐ -2์ผ๋, ๊ทธ ์ฐ์ธก ์๋ธํธ๋ฆฌ์ ๋ฃจํธ๋ ธ๋๊ฐ 1์ธ ๊ฒฝ์ฐ ๊ท ํ์ ๋ง์ถ๊ธฐ ์ํ ํ์ ์ ๋๋ค.
RL ํ์ ์ ์ค๋ฅธ์ชฝ์ผ๋ก ๋๋ฆฌ๊ณ , ์ผ์ชฝ์ผ๋ก ๋๋ฆฌ๋ ์์ ์ ๋๋ค.
BF๊ฐ -2์ธ ๋ ธ๋์ ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ(BF๊ฐ 1)์ ์ผ์ชฝ ์๋ธํธ๋ฆฌ์ ๋ํ์ฌ,
LLํ์ ์ ํ ํ, (์ค๋ฅธ์ชฝ์ผ๋ก ๋๋ฆฌ๊ณ )(๋์ด๊ฐ 1 ์ฆ๊ฐ)
RR ํ์ ์ ํด์ค๋๋ค. (์ผ์ชฝ์ผ๋ก ๋๋ฆฌ๊ณ )(๋์ด๊ฐ 1 ์ฆ๊ฐ)
๋๋ฒ์ ๊ฑธ์ณ์ ๋ ธ๋๋ฅผ ๋ฃจํธ๋ ธ๋๋ก ๋ง๋ค์ด์ฃผ๋ ์์ ์ ๊ฑฐ์นฉ๋๋ค.
LR ํ์
LR ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ํ์ ์ ๋๋ค.
LR ํ์ ์ ๋ ธ๋์ Balance Factor๊ฐ 2์ผ๋, ๊ทธ ์ข์ธก ์๋ธํธ๋ฆฌ์ ๋ฃจํธ๋ ธ๋๊ฐ -1์ธ ๊ฒฝ์ฐ ๊ท ํ์ ๋ง์ถ๊ธฐ ์ํ ํ์ ์ ๋๋ค.
LR ํ์ ์ ์ผ์ชฝ์ผ๋ก ๋๋ฆฌ๊ณ , ์ค๋ฅธ์ชฝ์ผ๋ก ๋๋ฆฌ๋ ์์ ์ ๋๋ค.
BF๊ฐ 2์ธ ๋ ธ๋์ ์ผ์ชฝ ์๋ธํธ๋ฆฌ(BF๊ฐ -1)์ ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ์ ๋ํ์ฌ,
RRํ์ ์ ํ ํ, (์ผ์ชฝ์ผ๋ก ๋๋ฆฌ๊ณ )(๋์ด๊ฐ 1 ์ฆ๊ฐ)
LL ํ์ ์ ํด์ค๋๋ค. (์ค๋ฅธ์ชฝ์ผ๋ก ๋๋ฆฌ๊ณ )(๋์ด๊ฐ 1 ์ฆ๊ฐ)
๋๋ฒ์ ๊ฑธ์ณ์ ๋ ธ๋๋ฅผ ๋ฃจํธ๋ ธ๋๋ก ๋ง๋ค์ด์ฃผ๋ ์์ ์ ๊ฑฐ์นฉ๋๋ค.
์๊ณ ๋ฆฌ์ฆ
private void rebalance(Node root) {
if (root.right().height() > root.left().height()+1 ) {//Right๋ก ํธํฅ๋ ๊ฒฝ์ฐ
if (root.right().left().height() > root.right().right().height() ) { // RLํ์ ์ด ํ์ํ ๊ฒฝ์ฐ
root.right().rotateRight(); // root์ right์ ๋ํ์ฌ LL ํ์ (์ค๋ฅธ์ชฝ์ผ๋ก ๋๋ฆฌ๊ธฐ)
}
root.rotateLeft();//RRํ์ (์ผ์ชฝ์ผ๋ก ๋๋ฆฌ๊ธฐ)
}
else if (root.right().height() + 1 < root.left().height() ) {//Right๋ก ํธํฅ๋ ๊ฒฝ์ฐ
if (root.left().right().height() > root.left().left().height() ) { // LRํ์ ์ด ํ์ํ ๊ฒฝ์ฐ
root.left().rotateLeft(); // root์ left ๋ํ์ฌ RR ํ์ (์ผ์ชฝ์ผ๋ก ๋๋ฆฌ๊ธฐ)
}
root.rotateRight();//LLํ์ (์ค๋ฅธ์ชฝ์ผ๋ก ๋๋ฆฌ๊ธฐ)
}
}
์์
๋ค์ ์์๋ก ์ ๋ ฅ์ด ๋ค์ด์จ๋ค๊ณ ํ๊ฒ ์ต๋๋ค.
$$8 \to 9 \to 10 \to 2 \to 1 \to 5 \to 3 \to 6 \to 4 \to 7 \to 11 \to 12$$
Reference
https://www.youtube.com/watch?v=syGPNOhsnI4&t=454s
'๐ฅ Computer Science > ์๋ฃ๊ตฌ์กฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๋ฃ๊ตฌ์กฐ] - B-Tree (0) | 2022.06.10 |
---|---|
[์๋ฃ๊ตฌ์กฐ] - 2-3 Tree (4) | 2022.06.10 |
[์๋ฃ๊ตฌ์กฐ] - Hash(ํด์) (0) | 2022.06.07 |
[์๋ฃ๊ตฌ์กฐ] - ๋ฅ(Deap : Double Endeded Heap) (0) | 2022.06.07 |
[์๋ฃ๊ตฌ์กฐ] - ์ฐ์ ์์ ํ(Priority Queue) (0) | 2022.06.06 |