π£ 4. Trees and Graphs
4. Trees and Graphs
π 1. νΈλ¦¬μ μ’ λ₯
- μ¬κ·μ μ€λͺ λ²
λ Έλ
λ‘ μ΄λ£¨μ΄μ§ μλ£ κ΅¬μ‘°- νλμ λ£¨νΈ λ Έλλ₯Ό κ°μ§
- μ¬κ· (μλ ꡬ쑰 λ°λ³΅)
- λ£¨νΈ λ Έλ : 0κ° μ΄μμ μμ λ Έλ
- μμ λ Έλ : 0κ° μ΄μμ μμ λ Έλ
- μ¬μ΄ν΄ μ‘΄μ¬ β
- κ° λ Έλλ μ΄λ€ μλ£νμΌλ‘λ νν κ°λ₯
1
2
3
4
class Node {
public String name;
public Node[] children;
}
π‘ Node
ν΄λμ€λ₯Ό ν¬ν¨νλλ‘ Tree
ν΄λμ€λ₯Ό μ μν μ μμ§λ§.. κ΅³μ΄..? μ¬μ©νλ€κ³ ν΄μ μ½λκ° λ μ’μμ§μ§ μμ
1
2
3
class Tree {
public Node root;
}
νΈλ¦¬ π μ΄μ§ νΈλ¦¬
- μ΄μ§ νΈλ¦¬(binara tree)
- κ° λ Έλκ° μ΅λ λ κ°μ μμμ κ°λ νΈλ¦¬
- μμμ΄ μλ λ
Έλ :
λ§λ¨ λ Έλ(Nil)
μ΄μ§ νΈλ¦¬ π μ΄μ§ νμ νΈλ¦¬
- ${λͺ¨λ μΌμͺ½ μμλ€} <= n < {λͺ¨λ μ€λ₯Έμͺ½ μμλ€}$ μ μμ±μ λͺ¨λ λ Έλ nμ λνμ¬ νμ μ°Έ
- λΆλ±μμ λ΄ λ°μ μλ λͺ¨λ μμ λ Έλλ€μ λν΄μ μ°Έμ΄μ΄μΌν¨
βοΈ μ΄μ§ νμ νΈλ¦¬μμ κ°μ κ°μ μ²λ¦¬νλ λ°©μ
- νΈλ¦¬λ μ€λ³΅λ κ°μ κ°μ§λ©΄ μλλ€?
- μ€λ³΅λ κ°μ μ€λ₯Έμͺ½ νΉμ μμͺ½ μ΄λ κ³³μ΄λ μ‘΄μ¬ν μ μλ€?
ππ» λͺ¨λ λ§λ λ§μ΄λ―λ‘ μ²μμ νΈλ¦¬μ μ μλ₯Ό μ΄λ»κ² νλλμ λ°λΌ λ¬λ €μλ€.
π‘ νΈλ¦¬ λ¬Έμ κ° μ£Όμ΄μ§λ©΄ μ΄μ§ νμ νΈλ¦¬μΌ κ²μ΄λΌκ³ κ°μ νλ κ²½μ°κ° λ§μ (β’ μΈν°λ·° λ¬Έμ λ‘ μ μλλ©΄ μ΄μ§ νμ νΈλ¦¬μΈμ§ μλμ§ νμ€ν λ¬Όμ΄λ΄μΌν¨)
κ· ν π λΉκ· ν
- βκ· νβ νΈλ¦¬
- $O(logN)$ μκ°μ
insert
μfind
λ₯Ό ν μ μμ μ λλ‘ κ· νμ΄ μ μ‘νμλ€λ₯Ό λμΆ© μ²λλ‘€ μΌλλ€.
- $O(logN)$ μκ°μ
- e.g. βλ λ-λΈλ νΈλ¦¬β, βAVL νΈλ¦¬β
μμ μ΄μ§ νΈλ¦¬
- νΈλ¦¬μ λͺ¨λ λμ΄μμ λ Έλκ° κ½ μ°¨ μλ μ΄μ§ νΈλ¦¬
- λ§μ§λ§ λ¨κ³μλ κ½ μ°¨ μμ§ μμλ λμ§λ§ λ Έλκ° μ’μμ μ°λ‘ μ±μμ ΈμΌνλ€.
μ μ΄μ§ νΈλ¦¬
- λͺ¨λ λ Έλμ μμμ΄ μκ±°λ μ νν λ κ° μλ κ²½μ°
- μμ νλλ§ μλ λ Έλ β
ν¬ν μ΄μ§ νΈλ¦¬
- μ μ΄μ§ νΈλ¦¬μ΄λ©΄μ μμ μ΄μ§ νΈλ¦¬μΈ κ²½μ°
- λ§μ§λ§ λ¨κ³μμ λ Έλμ κ°μκ° μ΅λκ° λμ΄μΌν¨
- λ Έλμ κ°μκ° μ νν $2^{k-1}$ κ° ($k$ : λμ΄)
μ΄μ§ νΈλ¦¬ μν
π‘ λ£¨νΈ λ Έλμ μν μμμ λ°λΌ λͺ λͺ
- μ€μ μν
1
2
3
4
5
6
7
void inOrderTraversal(TreeNode node) {
if (node != null) {
inOrderTraversal(node.left);
visite(node);
inOrderTraversal(node.right);
}
}
- μ μ μν
1
2
3
4
5
6
7
void preTraverse(TreeNode node) {
if (node != null) {
visit(node);
preTraverse(node.left);
preTraverse(node.right);
}
}
- νμ μν
1
2
3
4
5
6
7
void postTraverse(TreeNode node) {
if (node != null) {
postTraverse(node.left);
postTraverse(node.right);
visit(node);
}
}
μ΄μ§ ν(μ΅μ/μ΅λ ν)
- μ΅μν(min-heaps)
- μμ μ€λ¦μ°¨μ μ λ ¬
- μ΅λν(max-heaps)
- μμ λ΄λ¦Όμ°¨μ μ λ ¬
- μ΅μν π‘ μ΅λνμ μ΅μνκ³Ό λ°©μμ΄ μμ ν λμΌ(μ λ ¬ μμλ§ λ€λ¦)
- μμ μ΄μ§ νΈλ¦¬
- κ° λ Έλμ μμκ° μμλ€μ μμλ³΄λ€ μλ€
- λ£¨νΈ : νΈλ¦¬ μ 체μμ κ°μ₯ μμ μμ
- μ°μ°
insert
extract_min
- νΈλ¦¬μ λ°λ°λ₯μμλΆν° μ½μ
- μλ‘μ΄ μμ : λ°λ°λ₯ κ°μ₯ μ€λ₯Έμͺ½ μμΉλ‘ μ½μ
- μλ‘ μ½μ λ μμκ° μ λλ‘ λ μ리 μ°Ύμ λκΉμ§ λΆλͺ¨ λ Έλμ κ΅ν -> μ΅μ μμλ₯Ό μμͺ½μΌλ‘ μ¬λ¦Ό
- μ΅μ μμλ₯Ό μ κ±°ν νμ νμ μλ κ°μ₯ λ§μ§λ§ μμ(λ°λ°λ₯ κ°μ₯ μΌμͺ½ μμ)μ κ΅ν
- μ’/μ° μμ μ€ λ μμ μμμ κ΅ν
νΈλΌμ΄
μ λμ¬ νΈλ¦¬(prefix tree)
- nμ°¨ νΈλ¦¬μ λ³μ’
- κ° λ
Έλμ λ¬Έμλ₯Ό μ μ₯νλ μλ£κ΅¬μ‘°
- νΈλ¦¬λ₯Ό μλμͺ½μΌλ‘ μννλ©΄ λ¨μ΄ νλκ° λμ¨λ€.
- e.g. μ ν¨ν λ¨μ΄ μ§ν©μ μ΄μ©νλ λ¬Έμ
- μ λμ¬λ₯Ό λΉ λ₯΄κ² μ°Ύμ보기 μν¨ - μ£Όμ΄μ§ λ¬Έμμ΄μ΄ μ ννμ§ μλμ§ λΉ λ₯΄κ² νμΈ
- κΈΈμ΄κ° $k$μΈ λ¬Έμμ΄μ΄ μ£Όμ΄μ‘μ λ $O(k)$ μκ°μ ν΄λΉ λ¬Έμμ΄μ΄ μ ν¨ν μ λμ¬μΈμ§ νμΈ κ°λ₯
- νΈλ¦¬μ νμ¬ λ Έλλ₯Ό μ°Έμ‘°κ°μΌλ‘ λ겨μ μ λμ΄ λ°λ³΅ νμ κ°λ₯
- λ¨μ΄μ λ
- Null node (
* Node
) λ‘ νν- κ° λ Έλλ 1 ~ {λ¨μ΄ κΈΈμ΄ + 1} κ°μ μμ λ Έλλ₯Ό κ°μ§ μ μμ
- λΆλͺ¨ λ
Έλ μμ
boolean flag
λ₯Ό μλ‘ μ μν΄μ λ¨μ΄μ λμ νννκΈ°λ ν¨- κ° λ Έλλ 0 ~ {λ¨μ΄ κΈΈμ΄} κ°μ μμ λ Έλλ₯Ό κ°μ§ μ μμ
- Null node (
κ·Έλν
- $Tree β Graph$
- νΈλ¦¬ : μ¬μ΄ν΄μ΄ μλ νλμ μ°κ²° κ·Έλν
- κ·Έλν : λ¨μν λ Έλμ κ·Έ λ Έλλ₯Ό μ°κ²°νλ κ°μ μ νλλ‘ λͺ¨μ λμ κ²
- κ·Έλνμλ λ°©ν₯μ±μ΄ μμ μλ μκ³ μμ μλ μλ€.
- κ·Έλν : λΆλΆ κ·Έλνλ‘ κ΅¬μ± κ°λ₯
- μ°κ²° κ·Έλν : λͺ¨λ μ μ μ κ°μ κ²½λ‘κ° μ‘΄μ¬νλ κ·Έλν
- λΉμν κ·Έλν : μ¬μ΄ν΄μ΄ μλ κ·Έλν
κ·Έλν νν λ°©μ
- μΈμ 리μ€νΈ
- λ Έλ μ μ μ μΈμ 리μ€νΈμ μ μ₯
- νΈλ¦¬μμλ νΉμ λ Έλ(root) λ€λ₯Έ λͺ¨λ λ Έλλ‘ μ κ·Ό κ°λ₯ But, κ·Έλνλ νΉμ λ Έλμμ λ€λ₯Έ λͺ¨λ λ Έλλ‘ μ κ·Ό λΆκ°
1
2
3
4
5
6
7
8
class Graph {
public Node[] nodes;
}
class Node {
public String name;
public Node[] children;
}
- μΈμ νλ ¬
- N X N boolean matrix
matrix[i][j] == true
: iμμ jλ‘μ κ°μ μ‘΄μ¬- 무방ν₯ κ·Έλνμ μΈμ νλ ¬ νν : λμΉ νλ ¬(λκ°μ μ κΈ°μ€μΌλ‘)
κ·Έλν νμ
- κΉμ΄ μ°μ νμ(DFS)
- λ£¨νΈ λ Έλμμ μμν΄μ λ€μ λΆκΈ°λ‘ λμ΄κ°κΈ° μ μ ν΄λΉ λΆκΈ°λ₯Ό μλ²½νκ² νμνλ λ°©λ²
- λκ² νμνκΈ° μ μ κΉκ² νμ
- νΈλ¦¬ μνλ λͺ¨λ DFSμ ν μ’ λ₯
- μ¬κ·μ λμ
- e.g. λͺ¨λ λ Έλ λ°©λ¬Έ
1
2
3
4
5
6
7
8
9
void search(Node root){
if (root == null) return;
visit(root);
for each(Node n in root.adjacent) {
if (n.visited == false) {
search(n);
}
}
}
- λλΉ μ°μ νμ(BFS)
- λ£¨νΈ λ Έλμμ μμν΄μ μΈμ ν λ Έλ λ¨Όμ νμ
- κΉκ² νμνκΈ° μ μ λκ² νμ
- νλ₯Ό μ΄μ©ν λ°λ³΅μ νν
- e.g. λ λ Έλ μ¬μ΄ μ΅λ¨/μμ κ²½λ‘ νμ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void search(Node root) {
Queue queue = new Queue();
root.marked = true;
queue.enqueue(root);
while (!queue.isEmpty()) {
Node r = queue.dequeue();
visit(r);
foreach (Node n in r.adjacent) {
if (n.marked == false) {
n.marked = true;
queue.enqueue(n);
}
}
}
}
μλ°©ν₯ νμ
- μΆλ°μ§μ λμ°©μ§ λ λ Έλμμ λμμ λλΉ μ°μ νμ μν ν, λ νμ μ§μ μ΄ μΆ©λνλ κ²½μ° κ²½λ‘ νμ
- μ ν΅μ μΈ λλΉ μ°μ νμ : $O(k^d)$
- μλ°©ν₯ νμ : $O(k^{d/2})$
This post is licensed under CC BY 4.0 by the author.