-
TREE(Binary Tree, BST, B-Tree,B+Tree, AVL Tree,Red-Black Tree)์๋ฃ๊ตฌ์กฐ 2025. 2. 14. 20:52
๐ 1. Tree๋?
- **Tree(ํธ๋ฆฌ)**๋ ๊ณ์ธต์ (hierarchical) ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง ๋น์ ํ ์๋ฃ๊ตฌ์กฐ์ ๋๋ค.
- **๋ถ๋ชจ-์์ ๊ด๊ณ(Parent-Child)**๋ก ๋ ธ๋๋ค์ด ์ฐ๊ฒฐ๋ฉ๋๋ค.
- ๋ฃจํธ(Root)์์ ์์ํด ๋ฆฌํ(Leaf) ๋ ธ๋๊น์ง ์ด์ด์ง๋ ๊ตฌ์กฐ์ ๋๋ค.
๐งฉ 2. Tree์ ๊ธฐ๋ณธ ์ฉ์ด (Node ๊ตฌ์ฑ ์์)
Node(๋ ธ๋) ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๊ธฐ๋ณธ ๋จ์ Root(๋ฃจํธ ๋ ธ๋) ํธ๋ฆฌ์ ์์์ (๋ถ๋ชจ๊ฐ ์์) Leaf(๋ฆฌํ ๋ ธ๋) ์์์ด ์๋ ๋ ธ๋ Edge(๊ฐ์ ) ๋ ธ๋ ๊ฐ์ ์ฐ๊ฒฐ์ Depth(๊น์ด) ๋ฃจํธ์์ ํน์ ๋ ธ๋๊น์ง์ ๊ฑฐ๋ฆฌ Height(๋์ด) ํน์ ๋ ธ๋์์ ๊ฐ์ฅ ๊น์ ๋ฆฌํ๊น์ง์ ๊ฑฐ๋ฆฌ ๐ก Node์ ๊ตฌ์ฑ ์์
- ๋ฐ์ดํฐ(Data): ๋ ธ๋์ ์ ์ฅ๋๋ ๊ฐ
- ํฌ์ธํฐ(Pointer): ์์ ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋ ์ฐธ์กฐ ์ฃผ์
- ์๋ฐ์์๋ ํด๋์ค ๊ฐ์ฒด๋ก ํํ:
class TreeNode {
int value; // ๋ฐ์ดํฐ
TreeNode left; // ์ผ์ชฝ ์์ ๋ ธ๋
TreeNode right; // ์ค๋ฅธ์ชฝ ์์ ๋ ธ๋
TreeNode(int value) {
this.value = value;
this.left = null;
this.right = null;
}
}๐ณ ํธ๋ฆฌ(Tree)์์ ์ด์ง ํธ๋ฆฌ(Binary Tree), ์ด์ง ํ์ ํธ๋ฆฌ(BST), ๊ทธ๋ฆฌ๊ณ B-Tree๊ฐ ๋์จ ๋ฐฐ๊ฒฝ๊ณผ ๋ฐ์ ๊ณผ์
๐ 1. ํธ๋ฆฌ(Tree)์์ ์ด์ง ํธ๋ฆฌ(Binary Tree)๊ฐ ๋์จ ์ด์
๋ฐฐ๊ฒฝ:
- ์ผ๋ฐ์ ์ธ ํธ๋ฆฌ๋ ๋ถ๋ชจ ๋ ธ๋๊ฐ ์ฌ๋ฌ ์์ ๋ ธ๋๋ฅผ ๊ฐ์ง ์ ์๋ ๋น์ ํ ์๋ฃ๊ตฌ์กฐ์ ๋๋ค.
- ํ์ง๋ง ์์ ์๋ฅผ ์ ํํ์ง ์์ผ๋ฉด ๋ณต์ก๋๊ฐ ์ฆ๊ฐํ๊ณ , ๊ฒ์·์ฝ์ ·์ญ์ ์ฑ๋ฅ์ด ์ ํ๋ฉ๋๋ค.
์ด์ง ํธ๋ฆฌ(Binary Tree)๋?
- ๊ฐ ๋ ธ๋๊ฐ ์ต๋ ๋ ๊ฐ์ ์์(์ผ์ชฝ/์ค๋ฅธ์ชฝ)์ ๊ฐ์ง๋ ํธ๋ฆฌ์ ๋๋ค.
- ๊ฐ๋จํ ๊ตฌ์กฐ ๋๋ถ์ ์ฌ๊ท์ ํ์ ๋ฐ ๊ตฌํ์ด ์ฉ์ดํฉ๋๋ค.
๐ ์ด์ง ํธ๋ฆฌ๊ฐ ๋์จ ์ด์ :
- ๋ฉ๋ชจ๋ฆฌ ์ ์ฝ: ํฌ์ธํฐ๊ฐ 2๊ฐ๋ก ๊ณ ์ ๋์ด ๊ด๋ฆฌ๊ฐ ์ฝ๋ค.
- ๋น ๋ฅธ ํ์: O(log n)์ ํ์ ํจ์จ์ฑ (์์ ์ด์ง ํธ๋ฆฌ์ผ ๊ฒฝ์ฐ).
- ์ฌ๊ท์ ํํ: ์ฝ๋ ๊ตฌํ์ด ๊ฐ๋จํด์ง.
๐ 2. ์ด์ง ํ์ ํธ๋ฆฌ(BST: Binary Search Tree)๊ฐ ๋์จ ์ด์
๋ฐฐ๊ฒฝ:
- ์ผ๋ฐ ์ด์ง ํธ๋ฆฌ๋ ์์ ๋ ธ๋์ ๋ฐฐ์น์ **๊ท์น์ด ์์ด ํ์ ์ O(n)**์ ์๊ฐ์ด ๊ฑธ๋ฆด ์ ์์.
- ์ ๋ ฌ๋ ๋ฐ์ดํฐ๋ฅผ ๋น ๋ฅด๊ฒ ํ์ํ ์ ์๋ ๊ตฌ์กฐ๊ฐ ํ์ํด์ง.
๐ก ์ด์ง ํ์ ํธ๋ฆฌ(BST)๋?
- ์ด์ง ํธ๋ฆฌ์ ๊ท์น + ํ์ ๊ท์น์ ์ถ๊ฐํ ํธ๋ฆฌ.
๐ณ ์ด์ง ํธ๋ฆฌ(Binary Tree)์ ์ด์ง ํ์ ํธ๋ฆฌ(BST)์ ์ฐจ์ด์ ์ ๊ท์น์ ์๋ค!
๐ ๊ฒฐ๋ก ๋ถํฐ:
- ์ด์ง ํธ๋ฆฌ(Binary Tree): ํํ(๊ตฌ์กฐ)๋ง ์ ์๋จ → **“๋ ธ๋๋น ์ต๋ 2๊ฐ์ ์์”**๋ง ๊ท์น.
- ์ด์ง ํ์ ํธ๋ฆฌ(BST): ๋ฐ์ดํฐ ์ ๋ ฌ ๊ท์น์ด ์ถ๊ฐ๋จ → “์ผ์ชฝ < ๋ถ๋ชจ < ์ค๋ฅธ์ชฝ” + ์ฌ๊ท์ ๊ท์น.
๐งฉ ํต์ฌ ์ฐจ์ด: "๋ชจ๋ ์๋ธํธ๋ฆฌ๊ฐ BST ๊ท์น์ ๋ฐ๋ผ์ผ ํ๋ค"
๐ 1. ์ด์ง ํธ๋ฆฌ(Binary Tree)์ ๊ท์น
- ๋ ธ๋๋น ์ต๋ ๋ ๊ฐ์ ์์(left, right)๋ง ๊ฐ์ง๋ ํํ์ ๊ตฌ์กฐ.
- ๊ฐ์ ํฌ๊ธฐ์ ๋ํ ๊ท์น์ ์์.
- ์ผ์ชฝ ์์์ด ๋ถ๋ชจ๋ณด๋ค ํด ์๋, ์ค๋ฅธ์ชฝ ์์์ด ๋ถ๋ชจ๋ณด๋ค ์์ ์๋ ์์.
- ์ ๋ ฌ์ด๋ ํ์ ํจ์จ์ด ๋ณด์ฅ๋์ง ์์.
์์ : ์ด์ง ํธ๋ฆฌ (BST ์๋)
10
/ \
20 5 ← ๊ท์น ๊นจ์ง (์ผ์ชฝ ์์์ด ๋ถ๋ชจ๋ณด๋ค ํผ)๐ 2. ์ด์ง ํ์ ํธ๋ฆฌ(BST)์ ๊ท์น
- ์ด์ง ํธ๋ฆฌ์ ๋ชจ๋ ์์(์๋ธํธ๋ฆฌ)๊น์ง ํ์ ๊ท์น์ ๊ฐ์ ํจ.
- ๋ชจ๋ ๋
ธ๋๊ฐ ๋ฐ๋์:
- ์ผ์ชฝ ์๋ธํธ๋ฆฌ์ ๊ฐ์ ๋ถ๋ชจ๋ณด๋ค ์์
- ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ์ ๊ฐ์ ๋ถ๋ชจ๋ณด๋ค ํผ
- ์ด ๊ท์น์ด ์๋ธํธ๋ฆฌ๊น์ง ์ฌ๊ท์ ์ผ๋ก ์ ์ฉ๋์ด์ผ ํจ.
์์ : ์ด์ง ํ์ ํธ๋ฆฌ(BST)
10
/ \
5 20
/ \ / \
3 7 15 25 ← ๋ชจ๋ ์๋ธํธ๋ฆฌ๊ฐ ๊ท์น์ ์งํด๐ 3. ์ด์ง ํธ๋ฆฌ์ ์ด์ง ํ์ ํธ๋ฆฌ์ ์ฐจ์ด์ ์ ๋ฆฌ
๊ตฌ๋ถ ์ด์ง ํธ๋ฆฌ (Binary Tree) ์ด์ง ํ์ ํธ๋ฆฌ (BST) ๊ตฌ์กฐ ๊ท์น ๋ ธ๋๋น ์ต๋ 2๊ฐ์ ์์ ๋ ธ๋๋น ์ต๋ 2๊ฐ์ ์์ ๊ฐ ๋ฐฐ์น ๊ท์น ์์ ๋ชจ๋ ์๋ธํธ๋ฆฌ๊น์ง ์ผ์ชฝ < ๋ถ๋ชจ < ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ ๊ท์น ์ ์ฉ โ ์ผ๋ถ๋ง ์ง์ผ๋ ๋จ โ ๋ชจ๋ ๋ ธ๋์ ์๋ธํธ๋ฆฌ๊ฐ ๋์ผ ๊ท์น์ ์ ์ฉ ํ์ ์๋ O(n) (๋ฌด์ง์ํ ์ ์์) O(log n) (์ ๋ ฌ๋ ์ํ ์ ์ง) ์ฝ์ ๋ฐ ์ญ์ ์๋ O(n) (๊ท์น์ด ์์ด ์ฌ๋ฐฐ์ด ํ์) O(log n) (์ ๋ ฌ ์ ์ง ๋๋ถ์ ๋น ๋ฆ) ๐ 1. B-ํธ๋ฆฌ๊ฐ ๋์จ ๋ฐฐ๊ฒฝ: BST์ ํ๊ณ์
โ ๏ธ BST์ ๋ฌธ์ ์ (ํนํ ๋์ฉ๋ ๋ฐ์ดํฐ์์๋):
- ํธ๋ฆฌ์ ๊น์ด๊ฐ ๊น์ด์ง ์ ์์:
- ํนํ, ํธํฅ๋(skewed) BST๋ ์ฑ๋ฅ์ด O(n)์ผ๋ก ๋๋น ์ง.
- ๋์คํฌ I/O ๋น์ฉ:
- ๋ฐ์ดํฐ๋ฒ ์ด์ค(DB)๋ ํ์ผ ์์คํ ์์๋ ๋ฉ๋ชจ๋ฆฌ๋ณด๋ค ๋์คํฌ I/O ๋น์ฉ์ด ํจ์ฌ ํผ.
- BST๋ ์์์ด 2๊ฐ๋ผ ํธ๋ฆฌ๊ฐ ๊น์ด์ง๋ฉด, ๋์คํฌ ์ ๊ทผ ํ์๊ฐ ๋ง์์ง.
๐ก ํด๊ฒฐ์ฑ :
- ํ ๋ฒ์ ๋ ๋ง์ ํค๋ฅผ ๋ด๋ ๋ ธ๋๋ฅผ ๋ง๋ค๊ณ ,
- ์์ ์๋ ๋๋ ค ํธ๋ฆฌ ๋์ด๋ฅผ ๋ฎ์ถ์ด ๋์คํฌ ์ ๊ทผ์ ์ต์ํํ์!
๐ 2. B-ํธ๋ฆฌ(B-Tree)๋?
๐ก B-ํธ๋ฆฌ๋ M-Way(๋ค๋ถ๊ธฐ) ๊ท ํ ํธ๋ฆฌ:
- ์์ ๋ ธ๋ ์(M): ๊ฐ ๋ ธ๋๋ ์ต๋ M๊ฐ์ ์์์ ๊ฐ์ง ์ ์์.
- ํค(Key) ์: ๊ฐ ๋ ธ๋๋ ์ต๋ M-1๊ฐ์ ํค๋ฅผ ๊ฐ์ง.
- ๋ชจ๋ ๋ฆฌํ๋ ๊ฐ์ ๊น์ด(๊ท ํ ์ ์ง).
- ๋์คํฌ I/O๋ฅผ ์ต์ํํ๊ธฐ ์ํด ์ค๊ณ๋จ.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฐ ํ์ผ ์์คํ ์ ํ์ค ์ธ๋ฑ์ค ๊ตฌ์กฐ.
โ๏ธ B-ํธ๋ฆฌ์ ๊ท์น:
- ๋ชจ๋ ํค๋ ์ค๋ฆ์ฐจ์ ์ ๋ ฌ.
- ๊ฐ ๋ ธ๋๋ (M-1)๊ฐ์ ํค์ M๊ฐ์ ์์ ํฌ์ธํฐ๋ฅผ ๊ฐ์ง.
- ๋ชจ๋ ๋ฆฌํ ๋ ธ๋๋ ๊ฐ์ ๊น์ด.
- ์์ ๋ ธ๋๋ ๋ถ๋ชจ ํค์ ๊ตฌ๊ฐ์ ์ํ๋ ๊ฐ๋ง ํฌํจ.
- ํค ๊ฐ์๊ฐ ๋๋ฌด ๋ง์์ง๋ฉด ๋ถํ (Split), ๋๋ฌด ์ ์ด์ง๋ฉด ๋ณํฉ(Merge)
๐ 3. ์ด์ง ํ์ ํธ๋ฆฌ(BST)์ B-ํธ๋ฆฌ์ ์ฃผ์ ์ฐจ์ด์
๊ตฌ๋ถ ์ด์ง ํ์ ํธ๋ฆฌ (BST) B-ํธ๋ฆฌ (B-Tree) ์์ ์ ์ต๋ 2๊ฐ (left, right) ์ต๋ M๊ฐ (M-Way Tree) ๋ ธ๋๋น ํค ์ 1๊ฐ (์ด์ง) ์ต๋ M-1๊ฐ ํธ๋ฆฌ ๋์ด ํธํฅ๋๋ฉด ๋์ด๊ฐ ์ปค์ง (O(n)) ์์ ์๊ฐ ๋ง์ ๋์ด๊ฐ ๋ฎ์ (O(log n)) ๋์คํฌ I/O ๊น์ด๊ฐ ๊น์ด ๋์คํฌ ์ ๊ทผ์ด ์ฆ์ ํ ๋ฒ์ ๋ง์ ํค๋ฅผ ์ฝ์ด I/O ์ต์ํ ๊ท ํ ์ ์ง ํธํฅ๋๋ฉด ์ฑ๋ฅ ์ ํ (๊ท ํ ํธ๋ฆฌ ํ์) ์๋์ผ๋ก ๊ท ํ ์ ์ง (๋ชจ๋ ๋ฆฌํ ๋์ผ ๊น์ด) ์ฉ๋ ๋ฉ๋ชจ๋ฆฌ ๋ด ํ์์ฉ (์: TreeMap) ๋๊ท๋ชจ ๋ฐ์ดํฐ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ธ๋ฑ์ค, ํ์ผ์์คํ ๐ 4. B-ํธ๋ฆฌ์ BST์ ์๊ฐ์ ๋น๊ต (๊ทธ๋ฆผ ํฌํจ)
๐ (1) ์ด์ง ํ์ ํธ๋ฆฌ (BST) ์์ :
BST๋ ์์์ด 2๊ฐ๋ฟ์ด๋ผ, ๋ฐ์ดํฐ๊ฐ ๋ง์์ง๋ฉด ํธ๋ฆฌ๊ฐ ๋งค์ฐ ๊น์ด์ง ์ ์์.
30
/ \
20 50
/ / \
10 40 60๐ (2) B-ํธ๋ฆฌ ์์ (M=4):
B-ํธ๋ฆฌ๋ ํ๋์ ๋ ธ๋์ ์ฌ๋ฌ ํค๋ฅผ ๋ด์ ํธ๋ฆฌ์ ๋์ด๋ฅผ ํฌ๊ฒ ์ค์.
[30 | 50]
/ | \
[10 | 20] [40] [60 | 70 | 80]- ํ ๋ฒ์ ๋์คํฌ ์ ๊ทผ์ผ๋ก ์ฌ๋ฌ ํค๋ฅผ ๊ฒ์ํ ์ ์์.
- ํธ๋ฆฌ ๋์ด๊ฐ ๋ฎ์์ ธ ํ์ ์๋๊ฐ ๋นจ๋ผ์ง.
๐ 5. B-ํธ๋ฆฌ๊ฐ BST๋ณด๋ค ๋ ๋์ ์ด์ (ํนํ DB์์):
- ๐ ํธ๋ฆฌ์ ๋์ด๊ฐ ๋ฎ์์ง:
- ๋์ด๊ฐ O(log n)๋ก ๋งค์ฐ ๋ฎ์, ๋ฐ์ดํฐ๊ฐ ์๋ฐฑ๋ง ๊ฑด์ด์ด๋ ํจ์จ์ .
- ๐พ ๋์คํฌ I/O ๊ฐ์:
- ๋ ธ๋ 1๊ฐ = ๋์คํฌ ๋ธ๋ก 1๊ฐ
- ํ ๋ฒ์ ์ฌ๋ฌ ํค๋ฅผ ์ฝ์ด I/O ๋น์ฉ ์ต์ํ
- ๐ ์๋ ๊ท ํ ์ ์ง:
- ์ฝ์ /์ญ์ ์ ๋ ธ๋ ์๋ ๋ถํ ๋ฐ ๋ณํฉ์ผ๋ก ํญ์ ๊ท ํ(Balanced) ์ ์ง.
- ๐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ธ๋ฑ์ค ์ต์ ํ:
- MySQL(InnoDB), PostgreSQL, Oracle์ ๋ชจ๋ B+Tree ๊ธฐ๋ฐ ์ธ๋ฑ์ค ์ฌ์ฉ.
๐ก 6. ์์ฝ: B-ํธ๋ฆฌ๊ฐ BST๋ฅผ ๊ฐ์ ํ ์ด์
๐ฉ BST์ ๋จ์ ๐ B-ํธ๋ฆฌ์์ ํด๊ฒฐํ ์ ํธํฅ๋๋ฉด ๋์ด๊ฐ ๊น์ด์ ธ ๋๋ฆผ ๋ค์ค ์์(M-Way)์ผ๋ก ํธ๋ฆฌ ๋์ด๋ฅผ ๋ฎ์ถค (O(log n)) ์์ ์๊ฐ 2๊ฐ๋ผ ๋์คํฌ I/O ์ฆ๊ฐ ํ ๋ฒ์ ์ฌ๋ฌ ํค์ ์์์ ์ ์ฅํด I/O ์ต์ํ ๊ท ํ์ ์ ์งํ๋ ค๋ฉด AVL/Red-Black ํ์ ์ฝ์ /์ญ์ ์ ์๋์ผ๋ก ๊ท ํ ์ ์ง ๋ฉ๋ชจ๋ฆฌ ๋ด ํ์์ ์ ํฉ ๋์คํฌ ๊ธฐ๋ฐ ๋๊ท๋ชจ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ์ต์ ํ - BST๋ ๋ฉ๋ชจ๋ฆฌ ๋ด ํ์์ฉ์ผ๋ก ์ข์ง๋ง, **๋๊ท๋ชจ ๋ฐ์ดํฐ ์ฒ๋ฆฌ(DB)**์๋ ๋นํจ์จ์ ์ ๋๋ค.
- B-ํธ๋ฆฌ๋ ํธ๋ฆฌ ๋์ด๋ฅผ ๋ฎ์ถ๊ณ , I/O ๋น์ฉ์ ์ค์ฌ ๋๊ท๋ชจ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ต์ ํ๋ ๊ตฌ์กฐ์ ๋๋ค.
๐ณ B-Tree ๋ ธ๋ vs B+Tree ๋ ธ๋ ์ฐจ์ด์ ๋ฐ ๊ฐ์ ์
๐ 1. B-Tree์ B+Tree ๋ ธ๋ ๊ตฌ์กฐ ์ฐจ์ด
๐ (1) B-Tree ๋ ธ๋ ๊ตฌ์กฐ
- ํ ๋ ธ๋์ ํค(key)์ ๋ฐ์ดํฐ(data) ๋ชจ๋ ์ ์ฅ.
- ๋ฆฌํ ๋ ธ๋์ ๋ด๋ถ ๋ ธ๋ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง.
- ํ์ ์ ๋ฆฌํ์ ๋๋ฌํ์ง ์์๋ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์ ์ ์์.
---------------------------------------------------------------------------------------------------
- ๋ชจ๋ ๋ ธ๋์ ํค์ ๋ฐ์ดํฐ๊ฐ ํจ๊ป ์ ์ฅ๋จ.
- ๋ฒ์ ํ์ ์ ๋ฆฌํ ๋ ธ๋๋ฟ ์๋๋ผ ์ฌ๋ฌ ๋ ธ๋๋ฅผ ํ์ํด์ผ ํจ.
[30]
/ \
[10, 20] [40, 50, 60]- ํ์ ์์ (ํค: 50):
- ๋ฃจํธ(30) ๋น๊ต → ์ค๋ฅธ์ชฝ ์์ ์ด๋
- ์์ ๋ ธ๋์์ [40, 50, 60] ์ค 50 ํ์
- ๋ฒ์ ๊ฒ์: ๋ฃจํธ๋ถํฐ ํ์ํด์ผ ํ๋ฏ๋ก ์๋๊ฐ ๋๋ฆผ.
๐ (2) B+Tree ๋ ธ๋ ๊ตฌ์กฐ (B-Tree ๊ฐ์ ํ)
- ๋ชจ๋ ๋ฐ์ดํฐ๋ ๋ฆฌํ ๋ ธ๋์๋ง ์ ์ฅ.
- ๋ด๋ถ ๋ ธ๋(์ธ๋ฑ์ค ๋ ธ๋)์๋ ํค(key)๋ง ์ ์ฅ.
- ๋ฆฌํ ๋ ธ๋๋ ์์์ผ๋ก ์ฐ๊ฒฐ๋ฆฌ์คํธ(Linked List)๋์ด ์์.
- ๋ฒ์ ๊ฒ์ ๋ฐ ์์ฐจ ํ์(RANGE QUERY)์ด ๋น ๋ฆ.
[30 | 50]
/ \
[10, 20] [40, 50, 60]
↔ ↔- ํ์ ์์ (ํค: 50):
- ๋ฃจํธ(30, 50) ๋น๊ต → ์ค๋ฅธ์ชฝ ์์ ์ด๋
- ๋ฆฌํ ๋ ธ๋ [40, 50, 60]์์ ๋ฐ๋ก ๋ฐ์ดํฐ ํ์
- ๋ฒ์ ๊ฒ์: ๋ฆฌํ ๋ ธ๋๋ฅผ Linked List๋ก ๋ฐ๋ผ๊ฐ์ ๋น ๋ฅด๊ฒ ๊ฒ์.
๐ก 2. B+Tree์ ์ฃผ์ ๊ฐ์ ์ ๋ฐ ์ฅ์
๐ (1) ๋์คํฌ I/O ๊ฐ์ (๋๊ท๋ชจ ๋ฐ์ดํฐ ์ต์ ํ)
- ๋ด๋ถ ๋
ธ๋์ ๋ฐ์ดํฐ ์์ → ํ ๋
ธ๋์ ๋ ๋ง์ ํค(key) ์ ์ฅ
⇒ ํธ๋ฆฌ ๋์ด ๊ฐ์ → ๋์คํฌ I/O ์ต์ํ. - ๋๊ท๋ชจ ๋ฐ์ดํฐ(์๋ฐฑ GB ~ ์ TB)์์ ํจ์จ์ .
๐ (2) ๋น ๋ฅธ ๋ฒ์ ๊ฒ์ (Range Query)
- ๋ฆฌํ ๋
ธ๋๊ฐ Linked List๋ก ์ฐ๊ฒฐ๋์ด ์์.
⇒ WHERE BETWEEN ์ฟผ๋ฆฌ ๋ฑ ์์ฐจ ํ์์ด ๋งค์ฐ ๋น ๋ฆ. - B-Tree๋ ๋ฒ์ ํ์ ์ ๋ฆฌํ ๋ ธ๋๋ฅผ ๋ชจ๋ ํ์ํด์ผ ํจ.
๐ (3) ์ผ๊ด๋ ํธ๋ฆฌ ๊ตฌ์กฐ (Insert/Delete ์ ๊ตฌ์กฐ ์์ ์ฑ)
- ๋ฐ์ดํฐ๋ ํญ์ ๋ฆฌํ ๋
ธ๋์๋ง ์ ์ฅ
⇒ ์ฝ์ /์ญ์ ์ ๋ด๋ถ ๋ ธ๋ ๊ตฌ์กฐ ์ํฅ ์ ์
⇒ B-Tree๋ณด๋ค ๊ตฌ์กฐ ์ฌ์กฐ์ ์ด ๋น ๋ฅด๊ณ ๊ฐ๋จํจ.
๐ (4) ํจ์จ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ์บ์ฑ (DBMS ์ฑ๋ฅ ํฅ์)
- ๋ด๋ถ ๋ ธ๋์ ๋ฐ์ดํฐ๊ฐ ์๊ณ ํค๋ง ์์ → ๋ ์์ ๋ ธ๋ ํฌ๊ธฐ → ๋ฉ๋ชจ๋ฆฌ ์บ์ฑ ํจ์จ์ .
- ํธ๋ฆฌ ๊น์ด ์์์ง → ํ์ ์ ์บ์ฑ ํจ์จ์ฑ ์ฆ๊ฐ.
๐ ๏ธ 3. ์ B+Tree๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฃผ๋ก ์ฌ์ฉ๋ ๊น?
๐ฉ B-Tree ๋จ์ ๐ B+Tree์ ํด๊ฒฐ ๋ฐฉ์ ๋์คํฌ I/O ๋ง์ ๋ด๋ถ ๋ ธ๋์ ๋ฐ์ดํฐ ์ ๊ฑฐ → ํ ๋ ธ๋์ ๋ง์ ํค ์ ์ฅ → ํธ๋ฆฌ ๋์ด ๊ฐ์ ๋ฒ์ ํ์ ๋๋ฆผ ๋ฆฌํ ๋ ธ๋๋ฅผ Linked List๋ก ์ฐ๊ฒฐ → ๋น ๋ฅธ ์์ฐจ ํ์ ์ฝ์ /์ญ์ ์ ์ฌ์กฐ์ ๋ณต์ก ๋ฐ์ดํฐ๋ ๋ฆฌํ์๋ง ์ ์ฅ → ๋ด๋ถ ๋ ธ๋ ์ํฅ ์ต์ํ ๋ฉ๋ชจ๋ฆฌ ์บ์ฑ ํจ์จ ๋ฎ์ ๋ด๋ถ ๋ ธ๋๋ ํค๋ง ์ ์ฅ → ์์ ํฌ๊ธฐ → ์บ์ฑ ํจ์จ ํฅ์
๐ณ AVL Tree ๊ฐ๋ ๊ณผ ๋์ ์๋ฆฌ: BST์ ํธํฅ ๋ฌธ์ ํด๊ฒฐ
๐ 1. AVL Tree๋?
**AVL Tree(Adelson-Velsky and Landis Tree)**๋ **์ด์ง ํ์ ํธ๋ฆฌ(BST)**์์ ๋ฐ์ํ๋ ํธํฅ(Skew) ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด **์๊ธฐ ๊ท ํ(Self-Balancing)**์ ์ ์งํ๋ ์ด์ง ํ์ ํธ๋ฆฌ์ ๋๋ค.
๐งฉ 2. ์ AVL Tree๊ฐ ํ์ํ๊ฐ? (BST์ ํธํฅ ๋ฌธ์ )
๐ฉ BST์ ๋ฌธ์ : ํธํฅ(Skewed) ํธ๋ฆฌ
์ผ๋ฐ์ ์ธ **์ด์ง ํ์ ํธ๋ฆฌ(BST)**๋ ์ฝ์ ์์์ ๋ฐ๋ผ ํ์ชฝ์ผ๋ก ์ ๋ฆด ์ ์์ต๋๋ค. ์ด๋ฅผ **ํธํฅ ํธ๋ฆฌ(Skewed Tree)**๋ผ๊ณ ํ๋ฉฐ, ์ด ๊ฒฝ์ฐ **ํ์ ์๋๊ฐ O(N)**๊น์ง ๋๋ ค์ง๋๋ค.
๐ ์์ : BST์ ํธํฅ ๋ฌธ์
์ ๋ ฅ ์์: 10 → 20 → 30 → 40 → 50
BST (ํธํฅ ํธ๋ฆฌ):
10
\
20
\
30
\
40
\
50ํ์ ๋ณต์ก๋: O(N) (์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ๋์ผํ ์ฑ๋ฅ ์ ํ)
๐ก 3. AVL Tree๋ ์ด๋ป๊ฒ ํธํฅ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๊น?
๐ (1) ๊ท ํ ์กฐ๊ฑด (Balance Factor)
- ๊ฐ ๋
ธ๋์ Balance Factor(BF):
BF = (์ผ์ชฝ ์๋ธํธ๋ฆฌ ๋์ด) - (์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ ๋์ด)
- AVL Tree์ ์กฐ๊ฑด: ๋ชจ๋ ๋
ธ๋์ BF๋ -1, 0, +1๋ง ๊ฐ๋ฅํด์ผ ํจ.
⇒ ๋ง์ฝ ์ด ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ฉด **"ํ์ (Rotation)"**์ ํตํด ๊ท ํ์ ๋ง์ถค.
๐ [์์ ] LL (Left-Left) ํ์ ์์
์ฝ์ ์์: 10 → 20 → 30
1๏ธโฃ BST (ํธํฅ ๋ฐ์):
10
\
20
\
30
(Balance Factor๊ฐ +2 → LL Case)2๏ธโฃ LL ํ์ (Single Right Rotation):
20
/ \
10 30โ ๊ท ํ ํ๋ณต (๋ชจ๋ ๋ ธ๋ BF: -1, 0, +1)
โ ํ์ ๋ณต์ก๋: O(log N) ์ ์ง๐ [์์ ] RR (Right-Right) ํ์ ์์
์ฝ์ ์์: 30 → 20 → 10
1๏ธโฃ BST (ํธํฅ ๋ฐ์):
30
/
20
/
10
(Balance Factor๊ฐ -2 → RR Case)2๏ธโฃ RR ํ์ (Single Left Rotation):
20
/ \
10 30โ ๊ท ํ ํ๋ณต (๋ชจ๋ ๋ ธ๋ BF: -1, 0, +1)
โ ํ์ ๋ณต์ก๋: O(log N) ์ ์ง๐ก 4. AVL Tree์ ์ฅ์ ๊ณผ ํน์ง
๐ ํน์ง ๐ ์ค๋ช ๊ท ํ ์ ์ง (Self-Balancing) ๋ชจ๋ ๋ ธ๋์ ๋์ด ์ฐจ์ด(BF)๊ฐ -1, 0, +1๋ก ์ ์ง ๋น ๋ฅธ ํ์ (O(log N)) ๊ท ํ ์ ์ง ๋๋ถ์ ํ์, ์ฝ์ , ์ญ์ ๋ชจ๋ O(log N) ํ์ (Rotation)์ผ๋ก ๋ณต๊ตฌ ๊ท ํ์ด ๊นจ์ง๋ฉด ํ์ ์ ํตํด ์ฆ์ ๋ณต๊ตฌ BST ๋๋น ์ฑ๋ฅ ์์ ์ฑ ํ๋ณด BST์ ์ต์ O(N) ์ํฉ์ ๋ฐฉ์ง - BST์ ํธํฅ ๋ฌธ์ (Skew Problem)๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋์จ ์๊ธฐ ๊ท ํ ์ด์ง ํ์ ํธ๋ฆฌ
- **Balance Factor (BF)**์ **ํ์ (Rotation)**์ ํตํด ํญ์ O(log N) ์ ์ง
- ์ฝ๊ธฐ(read)๊ฐ ๋ง์ ์์คํ ์ ์ ํฉ (e.g. ๋ฉ๋ชจ๋ฆฌ ์บ์ฑ, ์ธ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฑ)
- Red-Black Tree๋ ์ฐ๊ธฐ(write)๊ฐ ๋ง์ ๋ ๋ ์ ๋ฆฌํจ
๐ฅโซ Red-Black Tree: ๋ฑ์ฅ ๋ฐฐ๊ฒฝ, AVL Tree์์ ์ฐจ์ด์ ๋ฐ ๊ฐ์ ์
๐ 1. Red-Black Tree๋?
Red-Black Tree๋ ์๊ธฐ ๊ท ํ ์ด์ง ํ์ ํธ๋ฆฌ(Self-Balancing Binary Search Tree) ์ค ํ๋๋ก, AVL Tree์ ๋จ์ (๋์ ํ์ ๋น์ฉ)์ ๊ฐ์ ํ๊ธฐ ์ํด ๋ง๋ค์ด์ก์ต๋๋ค.
๐ก ๋ฑ์ฅ ๋ฐฐ๊ฒฝ:
- AVL Tree๋ ์ฝ์ /์ญ์ ์ ๊ท ํ์ ์ ์งํ๋ ค๊ณ **ํ์ (Rotation)**์ ์์ฃผ ์ํํ์ฌ ์ฝ์ /์ญ์ ์ฑ๋ฅ์ด ๋ฎ์์ง.
- Red-Black Tree๋ ํ์ ๋น์ฉ์ ์ค์ด๊ณ ์ฝ์ /์ญ์ ์ ๊ท ํ์ ๋ ํจ์จ์ ์ผ๋ก ์ ์งํ๊ธฐ ์ํด 1978๋ Bayer์ Guibas๊ฐ ๊ณ ์.
- ํ์ฌ ์๋ฐ์ TreeMap, TreeSet, C++์ std::map, std::set, Linux ์ปค๋ ํ์ผ ์์คํ ๋ฑ์ ์ฌ์ฉ๋จ.
๐งฉ 2. Red-Black Tree์ ๊ท์น (์๊น ๊ท์น์ผ๋ก ๊ท ํ ์ ์ง)
Red-Black Tree๋ ๊ฐ ๋ ธ๋์ Red(๋นจ๊ฐ์) ๋๋ Black(๊ฒ์์) ์์ฑ์ ๋ถ์ฌํด ๊ท ํ์ ์ ์งํฉ๋๋ค.
โ Red-Black Tree ๊ท์น(5๊ฐ์ง)
- ๊ฐ ๋ ธ๋๋ ๋นจ๊ฐ์(Red) ๋๋ ๊ฒ์์(Black) ์ค ํ๋์ด๋ค.
- ๋ฃจํธ ๋ ธ๋๋ ํญ์ ๊ฒ์์์ด๋ค.
- ๋ชจ๋ ๋ฆฌํ ๋ ธ๋(NIL)๋ ๊ฒ์์์ด๋ค.
- ๋นจ๊ฐ์ ๋ ธ๋๋ ๋นจ๊ฐ์ ์์์ ๊ฐ์ง ์ ์๋ค. (Red๋ Red์ ์ฐ์๋ ์ ์์, Red ์์๋ ๋ฐ๋์ Black)
- ๋ชจ๋ ๊ฒฝ๋ก์์ ๋ฆฌํ(NIL) ๋ ธ๋๊น์ง์ ๊ฒ์์ ๋ ธ๋ ์๋ ๊ฐ์์ผ ํ๋ค. (Black-height ๋์ผ)
๐ Black-height๋?
- ๋ฃจํธ์์ ๋ฆฌํ๊น์ง ๊ฐ๋ ๊ฒฝ๋ก์์ ๋ง๋๋ ๊ฒ์์ ๋ ธ๋์ ๊ฐ์.
- Red-Black Tree๋ Black-height๊ฐ ๋ชจ๋ ๊ฒฝ๋ก์์ ๊ฐ๊ฒ ์ ์ง๋จ์ผ๋ก์จ ๊ท ํ์ ์ ์งํฉ๋๋ค.
๐ก 3. AVL Tree์ Red-Black Tree์ ์ฐจ์ด์ ๊ณผ ๊ฐ์ ์
๊ตฌ๋ถ AVL Tree Red-Black Tree ๊ท ํ ์กฐ๊ฑด ๋ชจ๋ ๋ ธ๋์ Balance Factor(BF): -1, 0, +1 ์ ์ง Black-height ๋์ผ (๊ท ํ ์ํ) ํ์ ๋น๋ ์ฝ์ /์ญ์ ์ ํ์ ์ด ์์ฃผ ๋ฐ์ ์ฝ์ /์ญ์ ์ ํ์ ์ด ๋ ๋ฐ์ (๋น ๋ฆ) ํ์ ์ฑ๋ฅ ํ์ ์๋ ๋น ๋ฆ (O(log N)) (๋์ด ๋ ๋ฎ์) ํ์ ์๋ **O(log N)**์ผ๋ก ๊ฑฐ์ ๋์ผ ์ฝ์ /์ญ์ ์ฑ๋ฅ ์ฝ์ /์ญ์ ๋๋ฆผ (ํ์ ๋ง์) ์ฝ์ /์ญ์ ๋น ๋ฆ (ํ์ ์ ์) ์ฌ์ฉ ์ฌ๋ก ์ฝ๊ธฐ(read)๊ฐ ๋ง์ ์์คํ ์ฐ๊ธฐ(write)๊ฐ ๋ง์ ์์คํ (DB, TreeMap, TreeSet) ๐งฉ 4. Red-Black Tree ์์ ์ ํ์ ๊ณผ์
๐ [์์ ] Red-Black Tree ์ฝ์ ๋ฐ ํ์ ๊ณผ์
์ฝ์ ์์: 20 → 15 → 30 → 10 → 18 → 25 → 40 → 16
1๏ธโฃ ์ด๊ธฐ ์ฝ์ :
20(B)
/ \
15(R) 30(R)2๏ธโฃ 18 ์ฝ์ (Red) → ๊ท์น ์๋ฐ (์ฐ์๋ Red):
20(B)
/ \
15(R) 30(R)
\
18(R) ← Red-Red Conflict ๋ฐ์๋ฌธ์ ๋ฐ์: Red-Red Conflict
- Red-Red Conflict๊ฐ ๋ฐ์ํฉ๋๋ค. ์๋ํ๋ฉด **15์ 18์ด ๋นจ๊ฐ์(Red)**์ด๊ธฐ ๋๋ฌธ์ ๋๋ค. Red-Black Tree ๊ท์น์ ๋ฐ๋ฅด๋ฉด, ์ฐ์๋ ๋นจ๊ฐ์ ๋ ธ๋๋ ํ์ฉ๋์ง ์์.
์ด ์ํ์์ Red-Black Tree์ ๊ท ํ์ ๋ง์ถ๊ธฐ ์ํด ํ์ ๊ณผ ์์ ๋ณ๊ฒฝ์ ์ํํด์ผ ํฉ๋๋ค.
3๏ธโฃ ํด๊ฒฐ ๋ฐฉ๋ฒ: ์์ ๋ณ๊ฒฝ ๋ฐ ํ์ (LR Case):
- ์์ ๊ต์ฒด: 15 → Black, 20 → Red
- Left Rotation ํ Right Rotation(LR ํ์ )
18(B)
/ \
15(R) 20(R)
\
30(R)์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ์ ์ฐจ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
1. ํ์ ๋ฐ ์์ ๋ณ๊ฒฝ:
- 15๋ ๋นจ๊ฐ์์ด๊ณ , 20์ ๊ฒ์์์ด๋ฏ๋ก ํ์ ๋ฐ ์์ ๋ณ๊ฒฝ์ ์งํํฉ๋๋ค.
- 15์ 20์ ์์์ ๋ฐ๋๊ณ , ํธ๋ฆฌ ๊ตฌ์กฐ๋ Left Rotation์ ํตํด ๊ท ํ์ ๋ง์ถฅ๋๋ค.
2. ํ์ ๊ณผ์ ์ค๋ช :
- Left Rotation: 20์ด **์์ ๋ ธ๋(15)**๋ณด๋ค ํฌ๋ฏ๋ก, 20์ ์ผ์ชฝ์ผ๋ก ํ์ ์์ผ 18์ด ์๋ก์ด Root๊ฐ ๋๋๋ก ํฉ๋๋ค.
- ์์ ๋ณ๊ฒฝ: 18์ ๊ฒ์์์ผ๋ก ๋ฐ๋๊ณ , 15์ 20์ ๋นจ๊ฐ์์ผ๋ก ๋ณ๊ฒฝ๋ฉ๋๋ค.
- ์ด๋ ๊ฒ ํ์ ๋ฐ ์์ ๋ณ๊ฒฝ์ด ์ด๋ฃจ์ด์ง์ผ๋ก์จ ํธ๋ฆฌ์ ๊ท ํ์ ๋ง์ถ๊ฒ ๋ฉ๋๋ค.
18(B)
/ \
15(R) 20(R)
\
30(R)3. ์ 3 depth์์ 2 depth๋ก ๋ฐ๋์๋๊ฐ?
- ์ต์ด ํธ๋ฆฌ์์ Depth๊ฐ 3์ด์์ง๋ง, ํ์ ํ์๋ ํธ๋ฆฌ๊ฐ 2 depth๋ก ์ค์ด๋ ์ด์ ๋ Root๊ฐ 18๋ก ๋ณ๊ฒฝ๋์๊ธฐ ๋๋ฌธ์ ๋๋ค. ํ์ ํ 18์ด ๋ฃจํธ ๋ ธ๋๊ฐ ๋๋ฉฐ, 15์ 20์ 1๋จ๊ณ ์๋์ ์์นํ๊ฒ ๋์ด ์ ์ฒด ํธ๋ฆฌ์ ๋์ด๊ฐ ์ค์ด๋ค์์ต๋๋ค.
4. ์ 20์ด Root์์ 18์ด Root๋ก ๋ฐ๋์๋๊ฐ?
- 20์ด Root์์ง๋ง, ์ฝ์ ๊ณผ์ ์์ ๋ฐ์ํ Red-Red Conflict๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ํ์ ์ ํ๊ณ , ์ด ํ์ ๊ฒฐ๊ณผ 18์ด ์๋ก์ด Root๋ก ์ฌ๋ผ๊ฐ์ต๋๋ค.
- Left Rotation ๊ณผ์ ์์ 20์ด 18์ ์์ ๋ ธ๋๊ฐ ๋์๊ณ , ๊ทธ์ ๋ฐ๋ผ 18์ด Root๋ก ์น๊ฒฉ๋์์ต๋๋ค.
5. 30์ ์ด๋๋ก ๊ฐ๋๊ฐ?
- 30์ ์ฌ์ ํ ํธ๋ฆฌ์ ๋จ์ ์์ต๋๋ค. ๋ค๋ง, 30์ 18์ ์ค๋ฅธ์ชฝ ์์์ผ๋ก ๋ณ๊ฒฝ๋์ง ์์ ์ฑ ๊ทธ๋๋ก ์์นํฉ๋๋ค. ์ฆ, 30์ ํ์ ์ ์ํฅ์ ๋ฐ์ง ์์ผ๋ฏ๋ก ๋ณ๊ฒฝ๋์ง ์๊ณ ๊ทธ๋๋ก ํธ๋ฆฌ์ ์ฐ์ธก์ ๋จ์ ์์ต๋๋ค.
๐ [์์ ] Red-Black Tree์ Black-height ์ ์ง ์๋ฆฌ
๋ชจ๋ ๋ฆฌํ(NIL) ๋ ธ๋๊น์ง์ ๊ฒ์์ ๋ ธ๋ ์๊ฐ ๋์ผํด์ผ ํฉ๋๋ค.
20(B)
/ \
15(R) 30(R)
/ \ / \
10(B) 18(B) 25(B) 40(B)
๋ชจ๋ ๋ฆฌํ๊น์ง Black-height = 2 (์ผ์ ํจ)๐ Red-Black Tree์ ์ฅ์ ๊ณผ ์ฌ์ฉ ์ฌ๋ก
โ ์ฅ์ :
- ์ฐ๊ธฐ(์ฝ์
/์ญ์ )๊ฐ ๋ง์ ๊ฒฝ์ฐ ์ฑ๋ฅ์ด ๋ฐ์ด๋จ:
ํ์ (Rotation)์ด AVL Tree๋ณด๋ค ์ ๊ฒ ๋ฐ์ → ์ฐ๊ธฐ(write) ์ฑ๋ฅ ํฅ์ - ํ์ ์ฑ๋ฅ ์ ์ง:
์ต์ ์ ๊ฒฝ์ฐ์๋ **O(log N)**์ ๋ณด์ฅ
๐ ์ฌ์ฉ ์ฌ๋ก:
- Java์ TreeMap, TreeSet: Red-Black Tree ๊ธฐ๋ฐ
- C++ STL์ map, set, multimap, multiset: Red-Black Tree ์ฌ์ฉ
- Linux ์ปค๋์ Completely Fair Scheduler(CFS)
- Database ์์คํ ์ ์ธ๋ฑ์ค(B-Tree์ ํจ๊ป ์ฌ์ฉ๋จ)
๐ก 6. ์์ฝ: AVL Tree vs. Red-Black Tree
- AVL Tree:
- ํ์ ์ฑ๋ฅ ์ต์ ํ (O(log N))
- ์ฝ์ /์ญ์ ์ฑ๋ฅ ์ ํ (ํ์ ๋ง์)
- ์ฝ๊ธฐ(read)๊ฐ ๋ง์ ํ๊ฒฝ์ ์ ํฉ
- Red-Black Tree:
- ๊ท ํ ์กฐ๊ฑด ์ํ → ์ฝ์ /์ญ์ ์ฑ๋ฅ ํฅ์
- ํ์ ์ฑ๋ฅ๋ O(log N) ์ ์ง (๊ฑฐ์ ๋์ผ)
- ์ฐ๊ธฐ(write)๊ฐ ๋ง์ ํ๊ฒฝ์ ์ ํฉ (DB, TreeMap, TreeSet)
'์๋ฃ๊ตฌ์กฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
LinkedList (0) 2025.02.17 ๋ฑ(Deque) (0) 2025.02.17 Jump Table์ด๋?(Branch Prediction & Speculative Execution)-Java (If, switch) (1) 2025.02.15